3-指令系统
指令系统分为如下六个功能组:
(1) 数据传送
(2) 算术运算
(3) 逻辑运算
(4) 串操作
(5) 程序控制
(6) 处理器控制
指令由四部分组成:标号、指令、操作数和注释。
对于每条指令,注意以下几点:
(1) 指令的功能
(2) 适用于指令的操作数寻址方式
(3) 指令对标志的影响
(4) 指令的长度和执行时间
一、指令列表
指令助记符 |
指令格式 |
指令说明 |
例子 |
传递指令:MOV |
MOV DST,SRC |
此指令把一个字节或一个字从源操作数SRC送至目的操作数DST(8位或16位) |
MOV AX,BUFFER MOV AX,CS |
交换指令:XCHG |
XCHG OPRD1, OPRD2 |
此指令把操作数OPRD1的内容与OPRD2 的内容交换(8位或16位) |
XCHG AL, AH XCHG SI, BX |
传送有效地址指令:LEA |
LEA REG, OPRD |
该指令把操作数OPRD的有效地址传送到操作数REG中。 |
LEA AX, BUFFER LEA DX, [BX+3] LEA SI, [BP+DI+4] |
LDS |
LDS REG,OPRD |
该指令把操作数OPRD中所含的一个32位地址指针的段值部分送到数据段寄存器(DS)中,将偏移部分送到指令给出的通用寄存器REG中。 |
LDS DI,[BX] LDS SI,FARPOINTER |
LES |
LES REG, OPRD |
该指令把操作数OPRD中所含的32位地址指针的段值部分送到附加段寄存器ES中,把偏移部分送到指令给出的通用寄存器REG中 |
|
PUSH/POP:堆栈操作指令,进栈和出栈 |
|
|
PUSH DS POP DI |
LAHF/SAHF |
|
该条指令把标志寄存器的低8位传送到寄存器AH的指定位中;或者从寄存器AH中把指定位送至寄存器的低8位中。 |
|
PUSHF/POPF |
|
该条指定把标志寄存器的内容压入堆栈;或者把当前堆栈顶的两个字节传送到标志寄存器中。 |
|
CLC/STC/CMC: 进位标志位操作指令 |
|
清除;置位;取反 |
|
CLD/STD:方向标志位操作指令 |
|
清除;置位 |
|
CLI/STI:中断标志位操作指令 |
|
清除;置位 |
|
普通加法指令:ADD |
ADD OPRD1, OPRD2 |
OPRD1ßOPRD1+OPRD2 |
|
带进位加指令: ADC |
ADC OPRD1,OPRD2 |
OPRD1ßOPRD1+OPRD2+CF |
|
加1指令: INC |
INC OPRD |
OPRD<-OPRD+1 |
|
减法指令: SUB |
SUB OPRD1,OPRD2 |
OPRD1<-OPRD1 – OPRD2 |
|
带借位减法指令: SBB |
SBB OPRD1,OPRD2 |
OPRD1<-OPRD1-OPRD2-CF |
|
减1指令: DEC |
DEC OPRD |
OPRD<-OPRD-1 |
|
取补指令: NEG |
NEG OPRD |
OPRD<-0-OPRD |
|
比较指令: CMP |
CMP OPRD1,OPRD2 |
OPRD1-OPRD2运算结果不存放到OPRD1,而是影响CF,ZF,SF,OFAF和PF |
|
无符号数乘法:MUL |
MUL OPRD |
如果OPRD是字节操作数,则把AL中的无符号数与OPRD相乘,16位结果送到AX中; 如果OPRD是双字节数,则把AX中的无符号数与OPRD相乘,32位结果送到DX和AX中,其中DX含有高16位,AX含有低16位。 |
|
有符号数乘法: IMUL |
IMUL OPRD |
把乘数和被乘数都当成有符号,其他与MUL类似 |
|
无符号数除法指令:DIV
|
DIV OPRD |
如果OPRD是字节操作数,则把AX中的无符号数处理OPRD,8位的商送到AL中,8位的余数送到AH中;如果OPRD是双字节数,则把DX(高16位)和AX(低16位)中的无符号数除以OPRD,16位的商送到AX中,16位余数送到DX中。 |
|
有符号数除法: IDIV |
IDIV OPRD |
把除数和被除数都当成有符号的,其他与DIV同。 |
|
字节转换成字指令:CBW |
CBW |
将寄存器AL中的符号扩展到寄存器AH中。即若AL的最高有效位为0,则AH=0;若AL的最高有效位为1,则AH=FFH |
MOV AX,3487H CBW 则AX=FF87H |
字转换成双字指令: CWD |
CWD |
把寄存器AX中的符号位扩展到寄存器DX中。若AX的最高有效位为0,则DX=0;若AX的最高有效位为1,则DX=FFFFH |
MOV AX, 4567H CWD
则AX=4567H, DX=0 |
逻辑否: NOT |
NOT OPRD |
把操作数OPRD取反,然后送回OPRD |
NOT AX |
逻辑与: AND |
AND OPRD1, OPRD2 |
对两个操作数进行按位逻辑“与”运算,结果送到目的操作数OPRD1 |
MOV AL,34H AND AL,0FH 则AL=04H |
逻辑或: OR |
OR OPRD1,OPRD2 |
对两个操作数进行按位逻辑“或”运算,结果送到目的操作数OPRD1中 |
|
逻辑异或: XOR |
XOR OPRD1,OPRD2 |
对两个操作数进行按位逻辑“异或”操作,结果送到目的操作数OPRD1中。 |
|
测试指令: TEST |
TEST OPRD1, OPRD2 |
和AND指令类似,把两个操作数进行按位“与”,但结果不送到操作数OPRD1中,仅仅影响标志。 |
TEST AL, 01000100B 如果位2和位6均为0,则执行上述指令后,ZF置为1;否则为0 |
算术左移SAL和逻辑左移SHL |
SAL OPRD, m SHL OPRD, m |
把操作数OPRD左移m位,每移动一位,右边用0补足一位,移出的最高位进入标志位CF |
|
算术右移: SAR |
SAR OPRD, m |
将操作数右移m位,同时每移一位,左边的符号位保持不变,移出的最低位进入标志位CF |
|
逻辑右移指令: SHR |
SHR OPRD, m |
将操作数右移m位,同时每移一位,左边用0补足,移出的最低位进入标志位CF |
|
ROL ROR RCL RCR |
|
左循环移位指令 右循环移位指令 带进位左循环移位指令 带进位右循环移位指令 |
|
二、堆栈指令说明
堆栈操作指令说明:
在8086/8088系统中,堆栈是一段RAM区域,称为栈底的一端地址较大,称为栈顶的一端地址较小。堆栈的段值在堆栈段寄存器SS中,堆栈指针寄存器SP始终指向栈顶。
在8086/8088系统中,进出堆栈的数据均以字节为单位。
堆栈的具体用途如下:
(1) 现场和返回地址的保护
(2) 寄存器内容的保护
(3) 传递参数
(4) 存储局部变量
三、循环移位指令说明
ROL:左循环移位指令; ROR:右循环移位指令
RCL:带进位左循环移位指令;RCR:带进位右循环移位指令
前两条没有把进位标志位CF包含在循环的环中;后两条把进位标志CF包含在循环的环中。
四、转移指令
转移分为段内转移(近转移)和段间转移(远转移)。
段内转移是指仅重置指令指针IP的转移,由于没有重置代码段寄存器CS,所以转以后继续执行的指令仍在同一个代码段中。包括条件转移指令和循环指令。
段间转移是指不仅重置IP,而且重新设置代码段寄存器CS的转移,由于重新设置了CS,所以转以后继续执行的指令在另一个段中。包括软中断指令和中断返回指令。
无条件转移指令和过程调用及返回指令,既可以是段内转移,也可以是段间转移。
对于不带进位的循环移位指令而言,如果操作数是8位,那么在移位8次后,操作数就能复原;如果操作数是16位,那么在移动16次后,操作数就能复原。
对于带进位的循环移位指令而言,则相应多一次才能复原。
五、循环指令
循环指令不影响各个标志位。
5.1计数循环指令
LOOP 标号
这条指令使寄存器CX的值减1,如果结果不等于0,则转移到标号,否则顺序执行LOOP指令后面的指令。此条指令类似于:
DEC CX
JNZ 标号
5.2等于/全零循环指令
LOOPE/LOOPZ 标号
这条指令使寄存器CX的值减1,如果结果不等于0,并且零标志ZF等于1,那么转移到标号,否则顺序执行。
5.3不等于/非零循环指令LOOPNE/LOOPNZ
LOOPNE 标号
LOOPNZ 标号
这条指令使寄存器CX的值减1,如果结果不等于0,并且零标志位ZF为0.,那么转移到标号,否则顺序执行。
5.4跳转指令
JCXZ 标号
跳转指令当寄存器CX的值等于0时转移到标号,否则顺序执行。
六、条件转移指令
ZF:Z,E SF:S OF:O PF:P CF:A,B,C
有:1,没有(N):0
但JAE和JNAE恰好相反,对应着CF为0和1
(1)JB和JBE的区别:前者是CF为1,,也即小于,跳转;后者是CF或ZF为1,也即小于等于,跳转。
(2)CMP和SUB区别:前者进行减操作,但不赋值;后者将减操作结果赋值给第一个操作数。