emu8086顺序&&循环例题(课堂知识)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

作为一名在校大学生,我将近期所学的知识进行总结。如有不足,欢迎交流。


例1:在键盘上输入两个一位数,在屏幕上显示它们的积。(顺序)

代码


; You may customize this and other start-up templates; 
; The location of this template is c:\emu8086\inc\0_com_template.txt

org 100h

MOV AH,1
INT 21H       ;键盘读入1第一个数
MOV BL,AL     ;保存到BL

MOV AH,2      ;输出回车
MOV DL,0DH
INT 21H   

MOV AH,2      ;输出换行
MOV DL,0AH
INT 21H                

MOV AH,1      ;读入第二个数字于AL
INT 21H         

SUB AL,30H    ;将读入的ASCALL转化为10进制
SUB BL,30H     

MUL BL         ;求得(AL)*(BL)=AX
MOV BL,10      ;10进制转化回去

DIV BL         ;分离出十位和个位
ADD AX,3030H   ;转化为相应的ASCALL码
MOV BX,AX      ;result保存在BX

MOV AH,2       ;输出回车
MOV DL,0DH
INT 21H

MOV AH,2       ;输出换行
MOV DL,0AH
INT 21H

MOV DL,BL      ;输出十位
MOV AH,2
INT 21H          

MOV DL,BH      ;输出个位
INT 21H
MOV AH,4CH           
 
ret

例2 :统计DAI字单元中二进制数据中含1的个数,结果存于DA2单元中。

分析:可以利用移位指令,将待判断的字数据一位一位地移到进位位CF中,然后判断CF是1还是0,以此实现对二进制数据中含1的个数统计。

代码

; multi-segment executable file template.

data segment
   
var1 DW 1234H
var2 DB 0  
   
ends


code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax
         
    mov bl,0     ;统计计数器清0
    mov ax,var1  ;变量1取出给ax
   ls:cmp ax,0     ;判断ax是不是等于0 若等于0,则退出
    je  tuichu   ; 
    SHL ax,1     ;逻辑左移
    JNC ls       ;cf等于0   统计计数器不需处理,继续判断
    ADD BL,1     ;cf = 1    BL++
    jmp ls
         
tuichu:mov var2,bl

    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.

例3 :求两个多字节数之和,这两个数在数据段10050H地址开始的内存单元中连续存放,低位在小地址一端,运算结果放在这两个数之后。设这两个多字节数均为8个字节长

代码

; multi-segment executable file template.

data segment

ends


code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax    
   ;;;;;;;;;;;;;;;;;;;;;;;;;; 
    mov AX,1000H   
    mov DS,AX       ;DS=1000H
    MOV SI,50H      ;第一个数的指针
    MOV DI,58H      ;第二个数的指针 
    MOV BX,60H      ;结果指针
    MOV CX,4        ;循环次数CX=4
    CLC             ;清空CF 
    
AA: MOV AX,[SI]     ;取第一个字到AX
    ADC AX,[DI]     ;AX<- AX+[DI]+CF
    MOV [BX],AX     ;存一个字到[BX]中
    PUSHF           ;保护进位 CF       ADD可能影响CF
    ADD SI,2        ;修改第一个数的地址指针
    ADD DI,2        ;修改第二个数的地址指针
    ADD BX,2        ;修改结果的地址指针
    POPF            ;恢复标志寄存器    ADD可能影响CF
    LOOP AA         ;CX-1,若不为0,转AA
    HLT             ;CX为0,暂停
    

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.

例4 :统计由DATA单元开始的数据块中能被3整除的数的个数。结果存于COUNT单元中。(设数据块中共有10个无符号数)

分析:可以采用除法指令,对待判断的无符号数做除3操作,然后检查余数是否为零,若为零,则该数能被3整除。利用计数控制循环

代码

; multi-segment executable file template.

data segment
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
var DB 12,13,14,15,16,17,18,19,21,24
count db 0     
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LEA SI,var    ;地址指针SI指向变量var的偏移地址   
    MOV BL,0      ;统计计数器清0 
    MOV CX,10     ;循环次数 
    
XH: MOV AL,[SI]   ;取数到AL
    MOV DL,3      ;除数放到DL寄存器 
    MOV AH,0      ;高八位补0
    DIV DL        ;AX/DL  余数在AH寄存器   判断能否被3整除,只需要判断AH=0
    CMP AH,0      ;若AH=0能被整除   AH!=0,不能被整除 
    JE  J1        ;统计计数器加1  
    JMP LX  
   
J1: ADD BL,1;     ;统计计数器加1
 
LX: INC SI        ;指针加1                                                       
    LOOP XH       ;继续循环 
    MOV count,BL ;循环结束,存放程序结果                                                          
                                                             
                                                             
                                                      
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                                                        
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值