(4).由(3)可知,数据段在144A段,如下图,用d命令查看数据段的值,依次为This is a program!$,接着下一个字的内容为0: (5)用t命令单步执行,前三次为初始化,具体的如下图: (6)用t命令执行,如下图,将偏移地址存入si,di; (7)用t命令执行,如下图,命令执行count次数; (8)执行结果,如下图: 题目三:查表法,实现一位16进制数转换为ASCII码显示 1.设计: 首先,在数据段中,定义0~9的ASCII码、A~F的ASCII码,并设定一个待转换的数;
第6页/共 10页
在代码段中,首先初始化,然后指定寄存器BX存放ASCII码转换表,根据待转换的数,查找ASCII码表,根据偏移地址确定转换结果。 2.源程序清单 data segment ASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,38h,39h ;0~9的ASCII码 db 41h,42h,43h,44h,45h,46h ;A~F的ASCII码 Hex db 0bh ;任意设定一个待转换的一位16进制数 data ends ;数据段定义 code segment ;代码段 main proc far assume cs:code,ds:data start: push ds xor ax,ax push ax mov ax,data mov ds,ax ;初始化 mov bx,offset ASCII ;BX指向ASCII码表 mov al,hex ;AL取得一位16进制数,正是ASCII码表中位移 and al,0fh ;只有低4位是有效的,高4位清0 xlat ;换码:AL←DS:[BX+AL] mov dl,al ;入口参数:DL←AL mov ah,2 int 21h ret ;02号DOS功能调用 ;显示一个ASCII码字符 main endp code ends end start 3.调试过程: 第7页/共 10页
(1)用masm程序产生mwn3.obj文件,编译没有错误,如下图: (2)用link程序产生mwn3.exe文件,没有错误,如下图: (3)进入debug调试,用u命令反汇编,查看代码段,数据段所在的内存单元; (4).由(3)可知,数据段在144A段,如下图,用d命令查看数据段的值,依次为5,6,7,接着下一个字的内容为0: 第8页/共 10页
(5).用t命令单步执行,前三次为初始化,具体的如下图: (6)用t命令执行,如下图,将BX指向ASCII码表; (7)用t命令执行,如下图,AL取得一位16进制数,即ASCII码表中位移; (8)用t命令执行,如下图,高4位清0,只有低4位有效; (9)用t命令执行,如下图,换码过程; (10)用t命令执行,输出结果B,如下图: 第9页/共 10页
四、总结 (1)了解了编制汇编语言程序的步骤:分析题意,确定算法;根据算法画出程序框图; 根据框图编写程序;上机调试程序。 (2)理解了调试过程的反复性,发生错误时,一步步往回验证,直到找到错误,修改后,继续重新执行。 (3)通过单步执行命令t跟踪调试,提高了对寄存器根据指令变化的理解;同时对debug命令格式、功能有了基础的了解。
第10页/共 10页