汇编语言指令大致分为以下几类
> 一、传送类指令
> 二、算数运算类指令
> 三、位操作指令
> 四、串操作指令
> 五、控制转移类指令
> 六、处理器控制类指令
> 七、汇编指令伪指令
* * * * *
**一、传送类指令**
**1.数据传送指令**
**(1) MOV 目的操作数,源操作数**
`将源操作数送到目的操作数,目的和源的数的长度要相同,否则会长度不匹配`
**(2)XCHG 传送指令**
`XCHG 目的操作数,源操作数 //把源和目的操作数交换数值`
**2.有效地址传送指令LEA**
~~~
LEA 目的操作数,源操作数
把源操作数的偏移地址送目的操作数,
源操作数必须是一个内存操作数,
目的操作数必须是16位通用寄存器
~~~
**3.堆栈指针操作指令**
堆栈是一块特殊的存储器区域,这块区域是以先进后出的方式工作,系统为此提供了特殊的指针SP,和段寄存器SS
主要特点是:
(1)堆栈是以字方式操作的
**(2)压入堆栈**。
①先修改指针:`SP=SP -2`
②再存入一个字
**(3)弹出堆栈。**
①先弹出一个字
②再修改指针:`SP=SP +2`
**(4)入栈指令PUSH**
格式:PUSH 操作数
该指令为数据入栈指令
即将操作数指定的一个字节的内容传送至SP所指的栈顶
寻址方式有寄存器寻址(段寄存器SS除外)和存储器寻址,
不能用立即数作操作数。
该指令不影响标志位。
过程:
首先,堆栈`SP=SP-2`
然后,操作数的高位字节——>存入((SP)+1)单元中
操作数的低位字节——>送入(SP)
**(5)出栈指令:POP**
POP 操作数
将SP所指的栈顶内容传送至操作数指定的一个字。
**寻址方式有:**
寄存器寻址(段寄存器SS除外)和存储器寻址
不能用立即数作操作数。
该指令不影响标志位。
**过程:**
首先堆栈((SP)+1)单元字节——>操作数的高字节位,
(SP)单元字节——>操作数的低位字节。
然后`SP=SP-2`
**4.输入输出指令**
**(1)IN 输入指令**
~~~
IN AL,N ; (N)——>AL
IN AX,N ; (N+1:N)——>AX
IN AL,63H ; 将端口地址为63H的一个字节内容输入到AL
IN AX,55H ;将两个相邻端口地址58H和59H的16位数据输入到AX
~~~
**(2)OUT 输出指令**
~~~
OUT N,AL ;(AL)字节——>N端口地址的单元中
OUT N,AX ;(AX)字——>N+1和N端口地址的单元中
OUT 66H,AL ;将AL内容送端口地址66H的单元中
OUT 66H,AX ;将AX内容送66H和67H端口地址的单元中
~~~
**!注意:**
> 在汇编语言中,端口地址小于256(十六进制00H~FFH)时
> 可以直接在指令中写出端口地址
> 如果端口地址大于256,先将端口地址送入DX寄存器中,
> 然后在IN或OUT指令中用DX代表端口地址。
* * * * *
**二、算数运算类指令**
参加运算的可以是无符号数或带符号数,带符号的数以补码的形式存放或参与运算
**1.加法指令**
**(1)ADD 目的操作数,源操作数**
目的操作数+源操作数——>目的操作数
**(2)ADC带进位的加法指令**
ADC 目的操作数,源操作数
目的操作数+源操作数+CF——>目的操作数
**例子:**
~~~
MOV AH,0 ;0——>AH
MOV AL,92H ;92H——>AL
ADD AL,86H ;92H+86H=18H——>AL,CF=1
ADC AH,0 ;(AH)+0+CF=0+0+1=1——>AH,即01H=AH
~~~
**(3)INC 加|指令**
INC 操作数 //操作数加1,结果送操作数
操作数可以是任意一个8或16位的通用寄存器或存储单元,不能是立即数
指令中操作数当作无符号数时,主要用于计数器计数或修改指针地址的值。
如:
~~~
INC DI ;(DI)=DI+1
INC CX ;(CX)=CX+1
~~~
**说明**:除了指令INC对标志位CF不影响外,其它加法指令对标志位的影响如下
> ①CF:两个数相加,最高有效位有进位时,即字节运算超出无符号输的范围
> 0~255,字运算超出无符号数的范围0~65535时,CF=1,否则CF=0.
> 故两个无符号数相加时,可用CF值来判断是否超出了无符号数的表示范围
> 如果CF=1表示此无符号数加法运算结果发生了溢出。
> ②PF:运算结果以二进制数表示时,若"1"的个数为偶数时PF=1,否则PF=0
> ③AF:运算中D3向D4有进位时,AF=1,否则为0
> ④ZF:运算结果为0时,ZF=1;否则ZF=0
> ⑤SF:运算结果最高位为1时,SF=1,否则为0
> ⑥OF:当两个操作数的符号相同,而相加的结果的符号与操作数的符号相反时
> OF=1,否则OF=0。该标志位用来判断带符号数相加的溢出
**例如:**
~~~
ADD AL,30H ;(AH)+30H ——> AL
ADD AX,3000H ;(AX)+3000H ——> AX
ADD BX,[SI] ;(BX)+((SI))——>BX
~~~
**2.减法指令**
**(1)SUB**
`SUB 目的操作数,源操作数`
目的操作数=目的操作数-源操作数
**(2)SBB 带错位的减法指令**
`SBB 目的操作数,源操作数`
目的操作数=目的操作数-源操作数-CF
**(3)DEC 减1指令 格式:DEC 操作数**
`DEC DI ;DI=(DI)-1`
**(4)NEG 求补指令**
~~~
NEG 操作数 //0-操作数的内容后结果回送操作数
MOV DI,05H
NEG DI ;DI=0-(DI)=0-05H=0FBH
~~~
**(5)CMP 比较指令**
CMP 目的操作数,源操作数
执行时目的操作数与源操作数相减,只根据结果设置标志位
操作数均保持原值不变
**3.类型扩展指令**
为了解决操作数长度的匹配,有时需要把数据类型进行扩展。
主要有把字节扩展成字,把字扩展成双字
~~~
CBW:字节扩展成字
CWD:字扩展成双字
~~~
**例子:**
**正数的扩展**
~~~
MOV AL,52H
CBW ;执行指令后,AX=0052H
CWD ;执行指令后,DX=0000H,AX=0052H
~~~
**负数的扩展**
~~~
MOV AL,86H
CBW ;执行指令后,AX=FF86H
CWD ;执行指令后,DX=FFFFH,FF86H
~~~
**4.乘法指令**
~~~
MUL :无符号数乘法
IMUL:带符号数乘法
~~~
目的操作数必须是累加器,不必在指令中写出。
**例子:**
**无符号数乘法**
~~~
MOV AL,05H
MOV BL,06H
MUL BL //执行结果AX=30=001EH
~~~
**有符号数乘法**
~~~
MOV AL,-5
MOV BL,+6
IMUL BL //AX=-30=FFE2H
~~~
**5.除法指令**
**DIV:无符号除法**
~~~
SRC(源操作数)为字节时,AL=AX/SRC的商,AH=AX/SRC的余数
SRC为字时:AX=(DX,AX)/SRC的商,DX=(DX,AX)/SRC的余数
~~~
商和余数都是无符号数。
**IDIV:有符号除法**
操作同上类似,目的操作数必须是累加器AX和DX,不必写出。
* * * * *
**三、位操作指令**
~~~
AND 与运算.
or 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL
~~~
**四、串操作指令**
~~~
DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
CMPS 串比较.
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串.
是LODS的逆过程.
REP 当CX/ECX<>0时重复.,也就是直到CX=0时结束
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
REPC 当CF=1且CX/ECX<>0时重复.
REPNC 当CF=0且CX/ECX<>0时重复.
~~~
**五、控制转移类指令**
**1>无条件转移指令 (长转移)**
~~~
JMP 无条件转移指令
CALL 过程调用
RET/RETF过程返回.
~~~
**2>条件转移指令 (短转移,-128到+127的距离内)**
~~~
( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 "1" 时转移.
~~~
**3>循环控制指令(短转移)**
~~~
LOOP CX不为零时循环.
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
~~~
**4>中断指令**
~~~
INT 中断指令
INTO 溢出中断
IRET 中断返回
~~~
**六、处理器控制类指令**
处理器控制类指令只能完成对CPU的简单控制功能。
共有12条
**对标志位操作**
~~~
CLC(进位位置0指令)
CMC(进位位求反指令)
STC(进位位置为1指令)
CLD(方向标志置1指令)
STD(方向标志位置1指令)
CLI(中断标志置0指令)
STI(中断标志置1指令)
~~~
**同步控制**
~~~
WAIT(等待)
ESC(交权)
LOCK(封锁总线)
~~~
**其他**
~~~
NOP(无操作)
HLT(暂停)
~~~
* * * * *
**七、汇编指令伪指令**
~~~
DW 定义字(2字节).
PROC 定义过程.
ENDP 过程结束.
SEGMENT 定义段.
ASSUME 建立段寄存器寻址.
ENDS 段结束.
END 程序结束.
~~~
* * * * *