循环程序设计【微机原理与汇编语言】<针对大学8086处理器>键入十进制数求其二进制表示1的个数、实现1到35的累加

实验一:键入十进制数求其二进制表示1的个数

实验代码:

.model small
.stack
.data
      INF1 db "Please input a number(0-65535):$"  
      INF2 db 0ah,0dh,"Number of 1 in binary number:$"
      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中的二进制数 
       
       ;统计1的个数并输入 
       MOV cx,16
LOOP:  SHL ax,1
       ADC bl,0               ;记录1的个数 
       LOOP LOOP
       
       CMP bl,10
       JB OUTPUT 
       
       ;1的个数大于10 
       MOV dl,31h
       MOV ah,2
       INT 21h                ;先输出一个1
       SUB bl,10              ;减去10再输出
       
OUTPUT:MOV dx,offset INF2
       MOV ah,9
       INT 21h

       ADD bl,30h
       MOV dl,bl
       MOV ah,2
       INT 21h  
       
       MOV ah,4ch
       INT 21h
        
       

       

实验结果:

 

实验二:实现1到35的累加

实验代码:

;自然数累加直到和大于60000,并且输出
.model small
.stack  
.data 
      OBUF db 7 dup(0)              ;用于显示十进制数
.code 
      MOV dl,'1'
      MOV ah,2 
      INT 21H
      MOV ax,@data
      MOV ds,ax
      MOV bx,1                      ;初始化bx,用于记录累加和
      MOV cx,1                      ;初始化cx,记录下一个要加的数n 
      
LOOP: INC cx
      MOV ax,cx
      ADD bx,ax                     ;求和
      
      ;将ax二进制转化为十进制输出
      push bx
      push cx
      MOV bx,offset OBUF+6          ;指向缓冲区最后一个字节
      MOV byte ptr[bx],"$"          ;将缓冲区最后一个字节付为$
      MOV cx,10                     ;作为被除数
LOOP1:MOV dx,0
      DIV cx
      ADD dl,30h                    ;余数转化为相应ASCII码
      DEC bx                        ;bx指向前一个缓冲区单元
      MOV [bx],dl
      OR  ax,ax                     ;将商为0反馈到ZF中
      JNZ LOOP1 
      ;输出+号
      DEC bx
      MOV byte ptr[bx],"+"
      ;输出十进制数
      MOV dx,bx
      MOV ah,9
      INT 21h
      pop cx
      pop bx      
            
      CMP bx,600
      JBE LOOP                      ;低于或者等于60000    
      ;输出结果  
      
      ;输出sum 
      MOV dl,"="
      MOV ah,2
      INT 21h 
      MOV ax,bx
      MOV si,offset OBUF+6          ;指向缓冲区最后一个字节
      MOV byte ptr[si],"$"          ;将缓冲区最后一个字节付为$
      MOV cx,10                     ;作为被除数
LOOP2:MOV dx,0
      DIV cx
      ADD dl,30h                    ;余数转化为相应ASCII码
      DEC si                        ;bx指向前一个缓冲区单元
      MOV [si],dl
      OR  ax,ax                     ;将商为0反馈到ZF中
      JNZ LOOP2 
      MOV dx,si
      MOV ah,9
      INT 21h
      
      MOV ah,4Ch
      INT 21h
      
      

实验结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

粒粒米z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值