我觉得这个实验的关键是将4位压缩的BCD码数转化成ASCII码进行显示,这里困惑了我很久,后来参考了一些其他的程序,才将这个问题解决掉。
mov ch,bh ;在ch处保存bh的值,先显示高位
mov cl,4
shr bh,cl ;右移4次取高位
add bh,30h ;BCD码转换成ASCII码
mov dl,bh ;欲输出字符
mov ah,2 ;调用系统功能2号
int 21h ;dos系统功能
mov bh,ch ;将ch值赋给bh
and bh,0fh ;显示低位
add bh,30h ;BCD转换成ASCII码
mov dl,bh ;欲输出字符
mov ah,2 ;调用系统功能2号
int 21h ;dos系统功能
这个是本程序的关键算法,首先我们先显示十位,右移4次进行将十位数移到个位数处,再然后进行加30h就能转化成ASCI码了,调用dos系统功能就能完成十位数的显示,再然后我们进行显示个位,与0fh相与,就能将十位数屏蔽掉,在用同样的方法就能显示个位。
在这里我就不再详细说了,大家仔细看看程序就能明白了
data segment ;定义数据段
ad1 dw 1289h ;定义第1个加数
ad2 dw 1162h ;定义第2个加数
data ends
stack segment para stack 'stack' ;定义堆栈段
db 100 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack ;定义代码段
start proc far ;程序开始
push ds
mov ax,0
push ax ;标准序,以便于返回dos系统
mov ax,data
mov ds,ax ;数据载入
lea si,ad1 ;定义数据ad1指针
lea di,ad2 ;定义数据ad2指针
mov ax,[si] ;取出数据
mov bx,[di] ;取出数据
add al,bl ;低位进行相加
daa ;十进制调整
adc ah,bh ;高位带进位相加
daa ;十进制调整
mov bx,ax ;将ax的值付给bx
mov ch,bh ;在ch处保存bh的值,先显示高位
mov cl,4
shr bh,cl ;右移4次取高位
add bh,30h ;BCD码转换成ASCII码
mov dl,bh ;欲输出字符
mov ah,2 ;调用系统功能2号
int 21h ;dos系统功能
mov bh,ch ;将ch值赋给bh
and bh,0fh ;显示低位
add bh,30h ;BCD转换成ASCII码
mov dl,bh ;欲输出字符
mov ah,2 ;调用系统功能2号
int 21h ;dos系统功能
;同理,下面使用同样的方法显示低2位
mov ch,bl
mov cl,4
shr bl,cl
add bl,30h
mov dl,bl
mov ah,2
int 21h
mov bl,ch
and bl,0fh
add bl,30h
mov dl,bl
mov ah,2
int 21h
ret ;返回dos系统
start endp
code ends
end start ;程序结束
dos系统输出的结果是:2451与预想结果一致,实验成功。
文章评论(0条评论)
登录后参与讨论