1、实验三 汇编语言程序设计综合实验 23.1 实验目的1. 掌握在 PC 机上建立、汇编、链接、调试和运行 8086 汇编语言程序的全过程。2. 学习较复杂的 8086 汇编语言程序设计的基本方法。3. 巩固对 8086 指令系统、汇编语言伪指令的学习和掌握。3.2 实验条件同 1.2。3.3 实验内容采用过程编写一个程序,从键盘输入一个十进制数,显示这个十进制数的位数。要求提示“Please enter data”后,光标停在第二行的开始处,然后键入一个十进制数;屏幕提示“The number of the data is”后,自动在下一行显示这个十进制数的位数。说明:键入十进制数时,键盘输入
2、的字符为 ASCII 码,09 的 ASCII 码为 30H39H。要显示十进制数位数,需用十进制数 09 的 ASCCII 字符来显示, 09 的 ASCII 码为30H39H。键入的十进制位数小于 99 位。3.4 上机步骤1. 编辑源程序用文本编辑器编辑源程序并以扩展名.ASM 保存。2. 汇编源程序用 MASM.EXE 对源程序进行汇编。汇编时,MASM.EXE 可以检查源程序中的语法错误并指出错误所在的行号。如果有错误,修改源程序中的语法错误并保存文件,然后重新对源程序进行汇编。汇编时没有错误,才会生成目标程序。3. 连接目标程序用 LINK.EXE 对生成的目标程序进行连接,生成可
3、执行程序。4. 运行可执行程序在命令提示符下运行可执行程序。在提示“Please enter data”后键入一个十进制数,然后按下 ENTER 键,如果程序功能设计正确,即可显示十进制数的位数,如图 2-1 所示(datanum 为可执行文件名) 。键入 1 位、5 位、9 位、13 位十进制数回车,对数据位数显示加以验证。最后按 Ctrl-C 程序退出,返回命令提示符。如果程序功能设计不正确,得不到正确的显示结果。为了检查程序设计中的错误,需要将可执行程序调入 TD 中进行调试。图 2-1 运行 datanum 时的结果5. 调试程序在 TD 中调试程序,就是通过单步运行、设置断点等手段,
4、观察程序运行的中间结果,与预期的结果加以比较和分析,找出程序设计中的功能性错误。如果发现错误,通过修改源程序,重新汇编、连接、运行,直至运行结果正确。在采用 TD 调试时,按 F7 或 F8 键,单步跟踪程序的执行。F7 与 F8 键的区别是,若当前执行的指令是 CALL 指令,则 F7 将跟踪进入被调入的子程序,而 F8 则把 CALL 指令及其调用的子程序当作一条完整的指令,要执行完子程序才停在 CALL 指令的下一条指令上。本程序由三个子程序组成,也可对三个子程序分别调试。调试每一个子程序时,可通过修改 IP 指针来从每一个子程序的第一条指令开始单步运行,方法如下:将可执行文件调入 TD
5、 中,查看代码区中每一个子程序的第一条指令的地址,然后按 Tab 键选择寄存器区为当前区域,将光标移到 IP 寄存器,直接键入子程序第一条指令的地址(如图 2-2 所示) ,在键入的同时屏幕上会自动弹出编辑输入窗口,最后按 OK 确认。以后就可用 F7 或 F8 键单步执行指令了, 根据需要,也可以修改相关寄存器的内容来验证程序的正确性。 图 2-2 将执行文件调入 TD 进行调试(0023H 时 string 子程序第一条指令的地址)3.5 编程提示、实验程序与框图按照程序的功能可将程序设计为一个主程序和三个子程序来完成:子程序一 string:通过 DOS 调用来等待键盘键入十进制数,若键
6、入 09 以外的字符则退出该子程序(也可以由程序设定按某一特定键,如 ENTER 键,退出该子程序) 。同时,子程序将键入的十进制数的位数作为子程序的出口,结果放到一个通用寄存器中(如 CL) 。子程序二 num:将通用寄存器(如 CL)中的十制数的位数在屏幕显示,过 DOS 调用由高位到低位逐位显示,十进制数位数最大为 99 位。子程序三 crlf:采用 DOS 调用,实现回车换行。1. 主程序框图根据主程序框图编写主程序data segmentstr1 db Please enter data,0dh,0ah,$str2 db The number of the data is,0dh,0
7、ah,$data endscode segment assume cs:code,ds:datastart: mov ax,datamov ds,axrepeat: 完成主程序jmp repeat2.键入十进制数子程序及框图string proc nearmov cl,0 ;CL 清零,存放十进制数的位数key: mov ah,1 int 21h 图 2-3 主程序流程图sub al,30h ;ASCII 值到二进制cmp al,0 jb exit ;键入值9,则退出inc cl ;十进制数位数加 1,存放在 CL 中jmp keyexit: retstring endpNY开 始DOS 调用
8、等待键入字符返 回cl=cl+130HAL39H?cl 清零,存放十进制数位数图 2-4 键入十进制数子程序框图3 显示十进制数位数子程序及框图num proc nearmov al,cl ;取数据的位数xor ah,ahmov ch,10div chcmp al,0 mov bl,ah ;保存位数的个位jz bb ;10 位数以下,跳转add al,30h ;将位数十位变为相应的 ASSCI 码mov dl,almov ah,2int 21h ;显示位数的十位bb: add bl,30h ;将位数的个位变为相应的 ASSCI 码mov dl,blmov ah,2int 21h ;显示位数的个
9、位retnum endp4 回车换行子程序及框图crlf proc near mov dl,0dhmov ah,2int 21hmov dl,0ahint 21hretcrlf endp code endsend start3.6 实验报告要求1. 实验报告中要有程序流程图及完整的源程序。2. 源程序需要通过实验调试正确,记录在调试过程中出现的错误及修改的内容。DOS 调用显示换行符DOS 调用显示回车符返回开始图 2-6 回车换行子程序框图Y开始入口:二进制数在 BX 中BX 循环左移 4 位返 回把 ASCCII 字符送入 DLCH 内容减一等于零吗?N十六进制数据位数 4 送入 CH将 BX 循环左移后的低 4 位转换为 ASCII 字符DOS 调用显示字符图 2-5 显示十进制数位数子程序框图3. 记录实验结果。