原创 汇编实验二:两个4位压缩BCD码数相加

2010-12-20 16:43 8467 7 7 分类: 软件与OS

我觉得这个实验的关键是将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与预想结果一致,实验成功。


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条