可以讲解一下这道题吗?调用HTOASC子程序,编写显示一个字节的十六进制

可以讲解一下这道题吗?调用HTOASC子程序,编写显示一个字节的十六进制,第1张

code segment

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 则可以 省去上述 *** 作。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8100854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存