实验要求:在数据段预先存放16个十六进制的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX](寄存器相对寻址)寻址方式找到对应数位的ASCII码,并取出显示。
汇编代码片段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
data segment asc db '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' ;数据段定义 data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov ah,1h int 21h ;此行和上一行调用DOS 1h号功能:键盘输入并回显,输入的值进入al mov bl,al ;将al的值赋给bl mov bh,0 ;由于下面要与40h比较而cmp必须是高精度比较 cmp bx,40h ;由于A的ascii码是40h,小于则是数字,大于等于则是字母 jns xxxxxx;(这里大家自己自定义名称) ;alp为alpha即字母SF=0未产生标志位则说明bx比A大是字母跳转到alp js num;否则跳转到num num:sub bx,30h;bx为数字 jmp over xxxxxx:sub bx,37h;减去37h则为数字 jmp over over:mov cl,asc[bx];cl的值是对应数位的ascii码 mov dl,cl mov ah,2;调用DOS 2h号回显功能,注意回显功能只能显示dl int 21h mov ah,4ch int 21h;结束 code ends end start |
实验结果在MASM FOR WINDOWS显示
输入数字5,返回数字5
输入字母A,返回字母A
debug调试:
1.输入5赋值给al,此时al显示的是5的ascii码35
2.注意bl的值变为35
3.Bx的值变为5
4.DS:ASC[BX]为35,注意cl的值为输入字符的ascii码
A的ascll码表示41H吗?
A的ascll码不是41H吗?
为什么
为什么alp段是减去37h啊
查看一下37H的 ASCII
显示 no stack segment
因为源程序没有定义堆栈段,所以链接程序给出警告,并不是错误
感谢您的解答,我已经几年没碰汇编了
显示symbol not defined:NUM
怎么解决啊
要定义啊,你是不是复制错了呢,这个代码应该没有问题的。
解决了,是我敲错了