assume cs:code
start:
mov bx,0
mov si,4
mov di,10h
input:
mov ah,07h 接受输入但不显示
int 21h
mov cl,al 将输入字符暂放入cl
sub al,30h -30将ASCII转为对应数
jb input 小于0,则不是有效字符,要求重新输入
cmp al,9
jbe goin 小于9,则是0-9十个数字,直接进入下一步处理
sub al,27h 判断输入是否是a-f
jb input 小于a,则输入字符无效,重新输入
cmp al,0fh 大于f,无效字符重新输入
ja input
goin:
mov ah,0
xchg ax,bx 交换bx,ax值
mul di 先输入的数乘上16D=10H
add bx,ax 将当于n1*10+n2,n1为之前输入数,n2为刚输入数
mov dl,cl 将有效字符显示出来
mov ah,02h
int 21h
dec si
jnz input 循环输入4个有效字符
mov dl,'=' 输入等于号
mov ah,02h
int 21h
mov ch,10H
print:
mov dl,1 假设输入的数的二进制每一位都是1
rol bx,1 将输入的数循环向左移1位
jc CF_1 如果该是1,则CF为1,即产生进位
mov dl,0 CF=0,即该位为0
CF_1:
mov ah,02h
add dl,30h 加0、1转为ASCII码
int 21h
dec ch 循环16=10H次,即一个4位十六进制等于16位的二进制
jnz print
mov ah,4ch
int 21h
code ends
end start
对于第1个字符,call htoasc 之后al里面应该是30H(这时候是对的,‘0’的ASCII码正是30H),然后又执行rol al,4,al变成03H了(结果已经错)。03H不是一个可显示字符,call dispc显示的结果当然不对,你应该把call htoasc 之后的rol al,4这行删掉。
其实代码里面显示低位的时候就没有rol al,4
push axax 的数据压入堆栈popax出栈 恢复 ax 数据
调用子程序前为了 保存 ax 的数据 不 受到影响,返回时 恢复原来的数据。
如果子程序不用到 ax 则可以 省去上述 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)