循环程序设计【微机原理与汇编语言】<针对大学8086处理器>十进制转换为二进制、二进制转换为十进制

实验一:

实验内容:输入一个十进制数把它转换为二进制数并且输出在控制台中

实验要点:(1)利用乘法(2)从高位开始处理

实验思路:(1)通过调用10号功能调用,将键入的十进制数存入定义的缓冲区IBUF中

                  (2)缓冲区IBUF由三部分组成,第一个字节空间是分配的缓冲区字节数,第二个字节

                           空间是实际使用的字节数,后面的空间则是数据内容。

IBUF DB 6,0,6,DUP(0)
6是分配字节数(1B),0是实际使用空间的字节数(1B,键入数值后会自动更改),6是分配字节空间(6B)
所以这个缓冲区能够容纳6个字节,且整个缓冲区占用8个字节的内存空间

                 (3)十进制数在IBUF中是以ASCII码存在,且用十六进制表示。

                          譬如输入61(十进制)在内存中占用两个字节空间表示为3631H,

                          因此我们要一个字节一个字节处理,即处理6然后处理1

                 (4)用指针SI指向IBUF+2(数据空间第一个字节)将其与0FH与屏蔽字节高四位,

                          使得36H变为06H将其变为实际的二进制数

                 (5)然后再处理下一个字节数(61中的1),依然按照上面的处理方法循环,

                          在循环体开始前要将前面处理的数乘以10(就相当于6*10),

                          处理完1后加上则表示6*10+1

实验代码:

.model samll
.stack
.data                                            
INF1 db "Please input a number(0-65535):$"
IBUF db 6
     db 0
     db 6 dup(0)
.code
START: MOV ax,@data
       MOV ds,ax
       ;输出字符串INF1
       MOV dx,offset INF1
       MOV ah,9
       INT 21h
       ;向缓冲区IBUF中输入字符串
       MOV dx,offset IBUF
       MOV ah,10
       INT 21h
       ;指定循环次数
       MOV cl,IBUF+1 ;传值
       MOV ch,0
       ;SI指向第一个字符
       MOV si,offset IBUF+2 ;传址
       MOV ax,0      ;用于记录二进制结果值
AGAIN: MOV dx,10
       MUL dx        ;将上个结果扩大10倍
       ;处理输入字符将其转化为二进制并且加入ax中 
       AND byte ptr [si],0fh 
       ADD al,[si]
       ADC ah,0                  ;al进位加入ah
       INC si
       LOOP AGAIN
       ;显示ax中的二进制数 
       MOV cx,16  
       MOV bx,ax
       MOV dl,0dh
       MOV ah,2
       INT 21h
       MOV dl,0ah
       MOV ah,2
       INT 21h
OUTPUT:MOV dl,0
       SHL bx,1
       ADC dl,30h
       MOV ah,2
       INT 21h
       LOOP OUTPUT
       MOV ah,4ch
       INT 21h
       END START
       
       
       

实验结果:

实验二:

实验内容:内存中有一个二进制数,将其转换为十进制并输出在显示台上

实验要点:(1)利用除法(2)从低位开始处理

实验思路:(1)输出的数存在内存中,其变量名为NUMBER

                  (2)定义一个缓冲区OBUF用于输出十进制数,bx指向其末端即数据区尾部,

                           因为处理是是从低位处理,则先存的数是低位的十六进制。

                  (3)将NUMBER放入al中,除以10得到余数(除法余数在dx中,商在ax中)

                           将余数dx加上30h即可得到低位的ASCII码存在[bx]中

                  (4)bx指针向前移动一个字节继续处理更高位直到所有位处理完

                  (5)最后调用10号功能调用输出缓冲区OBUF中的数即可实现

实验代码:

.model small
.stack
.data
      NUMBER DW 65535
      OBUF DB 6 dup(0)        ;用于存储要输出的十进制字符
.code
START:MOV ax,offset @data
      MOV ds,ax
      MOV ax,NUMBER           ;ax存储将要显示的二进制数据
      MOV bx,offset OBUF+5    ;将bx作为指针指向缓冲区尾部用于存放地位
      MOV byte ptr [bx],'$'   ;用于结束十进制字符       
      MOV cx,10               ;做除10运算
LOOP1:MOV dx,0                ;被除数高位置0
      DIV cx                  ;相当于ax除以10
      ADD dl,30h              ;dx中存储是余数(地位),形成余数对应的ASCII码
      DEC bx                  ;指针移动存储这位十进制字符数据
      MOV [bx],dl             
      OR ax,ax                ;判断ax是否为0,商是否为0就可以知道是否已经处理完数据
      JNZ LOOP1
      
      ;输出字符串,调用十号功能调用
      MOV dx,bx               ;dx指向数据最高位
      MOV ah,9
      INT 21h
      
      MOV ah,4ch
      INT 21h
      END START
      
      

 实验结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

粒粒米z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值