一、介绍:
上一篇介绍了编写代码的大致模板,下面将介绍如何来实现一些常见的指令。如有错误,敬请斧正,万分感谢!
二、关于寄存器:
指令与寄存器的使用是分不开的,一些指令对寄存器的使用没有要求。而有些指令只能使用固定的寄存器,所以我们先介绍寄存器再介绍指令。
1.数据寄存器
8086CPU中有4个16位通用寄存器,AX、BX、CX、DX,这四个寄存器都可以拆成高8位和低8位,2个寄存器使用(例如:AH和AL、BH和BL)。一般时候这些通用寄存器没有区别,可以随便用。但在一些特殊指令下(例如:循环乘除法),需要使用到特定的寄存器。
AX:Accumlator 累加器寄存器,特殊功能和MUL/DIV有关
BX:Base 基地址寄存器,一般是用来存偏移地址(8086汇编语言中的地址表示为:<段地址 :偏移地址>)。例如:DS:[BX]也可写成[BX],默认段地址为数据段,当然也可以指定为其他段。
CX:Count 循环计数器,和循环指令LOOP 有关
DX:Data 数据寄存器,特殊功能和MUL/DIV有关,也与输入输出有关
2.指针变址寄存器
SP、BP、SI、DI,这四个寄存器也是16位。与数据寄存器不同的是这四个寄存器不能拆成2个寄存器使用,它们一般用来存地址。
SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器;
三、常见的指令
1.MOV
功能:移动数据
MOV指令应用例子:
DATA SEGMENT
X DB 12H
Y DW 1234H
STRING DB 'HELLO,WORLD!'
DATA ENDS
STACK SEGMENT
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
MAIN:
MOV AX,DATA
MOV DS,AX
;MOV 寄存器,常量
MOV AX, 10 ;AX=10
MOV BL, 20 ;BL=20
;MOV 寄存器,寄存器
MOV AL, BL ;AL=20
;MOV 寄存器,内存
MOV CL, X ;CL=12H
MOV DX, Y ;DX=1234H
MOV BX,OFFSET STRING ;BX=STRING的偏移地址
MOV DL, [BX] ;DL=H
MOV DL, [BX+1] ;DL=E
MOV指令常见错误:
MOV AX,BL ;MOV 16bit,8bit 不匹配
MOV CL,999 ;超过表示范围
MOV X1, X2 ;MOV的2个操作数不能都是内存
2.ADD
功能:实现加法
ADD AX,X ;AX=AX+X
ADD其他使用要求与MOV相同
3.SUB
功能:实现减法
SUB AX,X ;AX=AX-X
SUB其他使用要求与MOV相同
4.INC
功能:实现自增
INC AX ;AX++
5.DEC
功能:实现自减
DEC AX ;AX--
6.MUL
功能:实现乘法
MUL r8/m8 ;AX = AL * r8/m8
MUL r16/m16 ;DX.AX = AX * r16/m16
为方便起见,r:寄存器,m内存。例如:r8表示8bit的寄存器,m8表示8bit内存操作数
7.DIV
功能:实现除法
DIV r8/m8 ; AX ÷ r8/m8, AL=商,AH=余数
DIV r16/m16 ;DX.AX ÷ r16/m16, AX=商,DX=余数
可见进行乘除法时,应当先用MOV把被乘数 /被除数(即AL或AX)设好,再MUL /DIV。