提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
作为一名在校大学生,我将近期所学的知识进行总结。如有不足,欢迎交流。
例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.