32位无符号整数以十进制形式打印输出屏幕【微机原理与汇编语言】<针对大学8086处理器>

实验内容:

有一个32位的二进制数,将其转换为十进制形式并且输出

实验难点:

我们知道二进制转换为十进制一般采用 除法指令DIV,但DIV指令只适用于二进制数低于或等于16位。因为DIV指令特点是DX存放商、AX存放余数。如果我们用32位的二进制数除以10则理应得到的商可能还是一个32位数,但没有足够空间大小的寄存器储存其中。

实验思路:

总体思路:就是采用减法去代替除法,可以将我们要处理的32位数不断减去10,每当减一个10,商计数器就加1,这样当数减到小于10时我们就可以得到相应最高位。

比如:我们假设商计数器是dx
61<我们这里用十进制表示其实是一样的,由于二进制的运算和十进制规则类似>
61-10=51    dx=1
51-10=41    dx=1+1
.......     ......
11-10=1     dx=6
此时的dx值就是我们要处理的高位

具体思路:

(1)、相关数据定义和数据区准备:

将要输出的32位二进制数高16位指定给dx,低16位指定给ax。

定义一个存放结果的ASCII码的缓冲区OBUF用于十进制输出。

定义指针bx指向缓冲区最后一个单元,先存入’$’,为了将数的低位存于缓冲区尾部使得最后能从高位到地位的输出。

(2)、主函数程序思想:

判断32位二进制数是否小于10,如果小于10直接跳转到处理字符将ASCII码存入OBUF中并调转到第m步。  

如果大于10,调用子程序dpFUN1并执行(子程序dpFUN1主要用于实现改进的除法指令,即用减法指令(低位SUB,高位SBB)实现。当32位二进制数(dx、ax)减10后,商计数器(di、si)加1(低位ADD,高位ADC)直到被减数小于10否则循环减10。最后得到的dx、ax即为余数,di、si为除10后的商。)

处理余数ax并将ASCII码存入OBUF中,将商计数器(di、si)中对应的值赋给(dx,ax)并判断是否为0,如果不为0则跳转到j循环,如果为0结束。

调用9号功能调用输出字符串结束程序。

 (3)、子程序思想:

子程序dpFUN1主要用于实现改进的除法指令,即用减法指令(低位SUB,高位SBB)实现。当32位二进制数(dx、ax)减10后,商计数器(di、si)加1(低位ADD,高位ADC)直到被减数小于10否则循环减10。最后得到的dx、ax即为余数,di、si为除10后的商。

运行注意事项:如果你采用的是8086那款图标编译器EMU8086,它的运行时间可能会很长大概20分钟,不是因为其时间复杂度大,而是因为这款编译器是单步运行,其他编译器可能就会很快

实验代码:

;实现32位无符号整数以十进制打印输出
.model small
.stack
.data 
      OBUF db 11 dup(0) 
.code   
      MOV ax,@data
      MOV ds,ax  
      MOV dx,0001h
      MOV ax,0000h
      MOV bx,offset OBUF+10
      MOV byte ptr [bx],'$'
      MOV cx,10                     ;用于被减数 
LOOP3:OR dx,dx
      JNZ NEXT3
      CMP ax,10
      JB NEXT1
NEXT3:MOV si,0
      MOV di,0                      ;si、di用于记录除10后商 
      call dpFUN1
      ;处理余数  
      MOV dl,al 
      ADD dl,30h
      DEC bx        
      MOV [bx],dl
      ;判断商是否为0  
      MOV ax,si
      MOV dx,di 
      JMP NEXT2
NEXT1:MOV dl,al
      ADD dl,30h
      DEC bx
      MOV [bx],dl
      MOV ax,0 
      MOV dx,0
NEXT2:OR dx,dx
      JNZ LOOP3
      OR ax,ax
      JNZ LOOP3
      MOV dx,bx
      MOV ah,9
      INT 21h
      MOV ah,4ch
      INT 21h
                                   
;用于计算32位数的商(di,si)和余数(ax)      
dpFUN1 proc 
      push cx    
      push bx
LOOP1: SUB ax,10
       SBB dx,0   
       CLC                          ;将进位标志清零
       ;用于记录商                      
       ADD si,1
       ADC di,0
       CLC                          ;将进位标志清零
       OR dx,dx                     ;判断是否是0
       JNZ LOOP1                    ;如果不是0则继续减10
       CMP ax,10
       JAE LOOP1                    ;ax大于等于10则继续减10  
       pop bx
       pop cx       
      ret
dpFUN1  endp
      

测试数据:00010000H

预期结果:65536

实验结果:

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

粒粒米z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值