Chapter 4 Instruction System
Instruction addressing mode 指令格式
操作码+目标操作数+源操作数
opcode + operand DST, operand SRC
储存操作数:
指令直接给出 Instruction gives directly
保存在寄存器中 Register
保存在内存中 Memory unit
Adressing mode 寻址方式
立即寻址Immediate addressing mode
立即寻址的特点是操作数就在指令内,因此,也叫做立即数,采用补码的形式存放,在执行阶段不访问内存。
寄存器寻址Register addressing mode
存储器寻址
直接寻址Direct addressing mode
优:从指令中可以直接的得到操作数的有效地址,且只访问内存一次。
缺:操作数的位数限制了寻址范围,而且,必须修改操作数才能修改地址。
寄存器间接寻址 Register-indirect addressing mode
数据依然保存在存储器单元中,只不过存储单元的偏移地址存放于寄存器中。
不是所有的寄存器都可以用来进行寻址
可用:BX, SI, DI, BP。
其中BX, SI, DI默认的段地址为DS指向的数据段。
BP默认的段地址为SS指向的堆栈段。
寄存器相对寻址 Register relative addressing mode
寄存器相对寻址是在寄存器间接寻址的基础之上进行
基址变址寻址 Based-indexed addressing mode
基址变址寻址,包括后面的基址变址且相对寻址
其数据段地址由基址寄存器决定,即BX, SI, DI作为基址寄存器时,数据在DS指定的的数据段中,BP作为基址寄存器时,数据在SS指向的堆栈段。
有效地址为 基址寄存器BX or BP 加上 变址寄存器SI or DI的和
基址变址相对寻址 Relative based-indexed addressing mode
I/O端口寻址Port addressing
用IN和OUT指令访问由输入输出端口编址组成的I/O空间
优点:输入输出的指令和访问存储器的指令明显区别;长度短,执行快,不占用内存
缺点:CPU需要有专门的IN、OUT指令且这些指令没有访问存储器指令强
直接端口寻址:指令直接提供8为立即数地址
如:
IN AL/AX, 63H
OUT 64H, AL/AX
间接端口寻址:由DX寄存器给出端口地址
如:
IN AL/AX, DX
OUT DX, AL/AX
隐含寻址Implicit addressing mode
有些指令无需指明操作数,或者只有一个操作数。这类寻址的方式称为隐含寻址。
类似的指令有:CLI, MUL, PUSH。
Instruction操作指令
General Transfer Instruction
传送指令MOV
MOV DST, SRC ;可以是字节或字 BYTE / WORD
;把SRC(源操作数)传送到DST(目标操作数)
注意:
操作数长度要求一致
不可以同时为存储器操作数
不可以同时为段寄存器
SRC为立即数时,DST不可以是段寄存器
IP, CS 不作为DST
堆栈指令 PUSH / POP
堆栈在内存,先进后出,8086由高向低堆栈
堆栈指针SP指向当前栈
PUSH入栈指令
PUSH SRC ;是字WORD
SRC 不能是立即数
SRC高字节先入(SP-1)低字节后入(SP-2)
执行后SP变为SP-2
如:
AX = 1234H
SP = 1200H
PUSH AX ; 则先11FFH为12H, 后11FEH为34H
指针SP = 11FEH
POP 出栈指令
POP DST ; 字WORD
DST 不能是立即数或CS段寄存器
先送入低字节SP, 在送入高字节SP+1
SP变为SP+1(SP的内容加2)
如:
AX = 1234H
SP = 1200H
POP AX ; 先1200H 为34H, 后1201H为12H,
指针SP=1202H
交换指令 XCHG
XCHG OPR1, OPR2 ; Byte or Word
OPR1 和 OPR2 中有一个在寄存器中,但不能是段寄存器
OPR1 和 OPR2两个不能同时在存储器中
结果不影响标志位(正负不变)
换码指令XLAT
XLAT ; Byte
把[BX+AL] 地址的操作数 给到AL
BX: 指向表的首地址
AL: 表中某项的偏移量
地址传送指令LEA
LEA REG, SRC
把SRC的有效地址传送到寄存器REG中
规定:SRC只能是存储器操作数,REG只能用16位寄存器,不能用段寄存器
I/O传输指令 IN and OUT
直接输入 the IN instruction: IN AX, PORT
直接输出the OUT instruction:OUT AX, PORT
间接输入the indirect IN instruction:IN AX, DX
间接输出the indirect OUT instruction:OUT AX, DX
算术运算指令Arithmetical Operation Instruction
算数运算涉及符号数和无符号数
加减运算时指令相同,无符号数用CF=1表示溢出,符号数用OF=1表示溢出
**溢出与进位
进位CF=1: 运算结果向更高位进位或借位(D7向D8)
溢出OF=1: 最高有效位均为0相加得1;最高有效位均为1相加得0(正数相加为负数,负数相加为正数,正数减负数为负数,负数减正数为正数)
乘除运算时指令不同
加法运算(不带进位)ADD instruction
ADD DST, SRC ;B/W
源操作数可以是8位/16位寄存器、存储器操作数或立即数
目的操作数不可以位立即数、两者不可同时位存储器存储数
对6个状态标志位都有影响
加法运算(带进位)ADC instruction
ADC DST, SRC ;B/W
进位标志位也加入计算,结束运算后CF会根据结果重新给值
ADC主要用于多字节(或字)运算
加一INC instruction
INC OPR;B/W
令OPR加一
OPR不可以是立即数或段寄存器内容
减法(不带借位)SUB instruction
SUB DST, SRC ; B/W
源操作数可以是8位/16位寄存器、存储器操作数或立即数
目的操作数不可以位立即数、两者不可同时位存储器存储数
对6个状态标志位都有影响
减法(带借位)SBB instruction
SBB DST, SRC ;B/W
进位标志位也加入计算,结束运算后CF会根据结果重新给值
SBB主要用于多字节(或字)运算
减一DEC instruction
DEC OPR ;B/W
常用于循环程序中修改指针和循环次数
OPR不可以是立即数或段寄存器的内容
比较(做减法看标志位)CMP instruction
CMP OPR1, OPR2 ;B/W
不保留减法结果,只根据状态标志位判断
BCD code adjustment instruction
DAA 压缩BCD码加法调整指令
DAS 压缩BCD码减法调整指令
只能对AL中的结果进行调整(单字节调整),如果是多个字节的十进制加减,则需要从低字节开始逐字节进行运算调整
无符号数乘法
Unsigned number multiply instruction(MUL)
MUL SRC ;B/W
字节操作:AL*SRC 传给 AX
字操作:AX*SRC 传给 DX(高16位)、AX(低16位)
目的操作数DST必须是累加器(AX或AL)
源操作数SRC不能是立即数和段寄存器
符号数乘法
Signed number multiply instruction(IMUL)
IMUL SRC ;B/W
字节操作:AL*SRC 传给 AX
字操作:AX*SRC 传给 DX(高16位)、AX(低16位)
目的操作数DST必须是累加器(AX或AL)
源操作数SRC不能是立即数和段寄存器
无符号数除法
Unsigned number division instruction(DIV)
DIV SRC; B/W
字节操作:AX存16位被除数,SRC为8位除数,8位商存在AL,8位余数存在AH
字操作:AX(低)、DX(高)存32位被除数,SRC为16位除数,16位商存在AX,16位余数存在DX
符号数除法
Signed number division instruction(IDIV)
IDIV SRC; B/W
字节操作:AX存16位被除数,SRC为8位除数,8位商存在AL,8位余数存在AH
字操作:AX(低)、DX(高)存32位被除数,SRC为16位除数,16位商存在AX,16位余数存在DX
**余数符号与被除数相同
字节/字扩展
Byte word extension instruction(CBWCWD)
CBW ;
把AL的符号位扩展到AH中
CWD ;
把AX的符号位扩展到DX中
Logical Operations and Shift Instructions
逻辑运算指令 Logical operations instruction
AND
AND DST ,SRC ;B/W
对二进制数逐位进行“与”运算,相同保留,不同取0
更多用于屏蔽数据某位
0FH = 00001111B
OR
OR DST ,SRC ;B/W
对二进制数逐位进行“或”运算,源操作数为1的位数进行替换,其余位保留
更多用于保留数据某位
80H = 1000 0000 B
NOT
NOT OPR ; B/W
操作数按位取反
XOR
XOR DST , SRC ; B/W
对DST 和 SRC 按位进行异或运算,结果存入DST
TEST
TEST OPR1, OPR2; B/W
OPR1和OPR2逐位进行“与”运算,结果不保留,(不改变OPR1和OPR2),改变状态标志位
- SF = 将结果的最高位赋给SF标志位,例如结果最高位是1,SF就是1
- 看TEMP是不是0,如果TEMP是0,ZF位置1;如果TEMP不是0,ZF位置0
- PF = 将TEMP的低8位,从第0位开始,逐位取同或。也就是第0位与第1位的同或结果,去和第2位同或,结果再去和第3位同或…直到和第7位同或。PF位是奇偶校验位,如果结果低8位中1的个数是偶数,PF=1;否则PF=0
- CF位置0
- OF位置0
移位运算指令
非循环移位指令Acyclic shift instruction
SHL逻辑左移指令
SHL OPR COUNT; B/W
操作数每左移一次,操作数的最低位补零,最高位移入CF(CF的原值丢失)
SHR逻辑右移指令
SHR OPR COUNT; B/W
操作数每右移一次,操作数的最高位补零,最低位移入CF(CF的原值丢失)
SAL算术左移指令(与SHL相同)
SAL OPR COUNT; B/W
操作数每左移一次,操作数的最低位补零,最高位移入CF(CF的原值丢失)
SAR算术右移指令
SAR OPR COUNT; B/W
每右移一次,操作数的最低位移入CF,最高位(符号位)不变,次高位与最高位相同
循环移位指令Cyclic shift instruction
ROL循环左移指令
ROL OPR COUNT; B/W
每移位一次,操作数的最高位被移入操作数的最低位,同时(最高位)移入标志位CF
ROR循环右移指令
ROR OPR COUNT; B/W
每移位一次,操作数的最低位被移入操作数的最高位,同时(最低位)移入标志位CF
RCL带进位循环左移指令
RCL OPR COUNT; B/W
每移位一次,操作数的最高位移入标志位CF,而原CF中的值移到操作数的最低位
RCR带进位循环右移指令
RCR OPR COUNT; B/W
每移位一次,操作数的最低位移入标志位CF,而原CF中的值移到操作数的最高位
Program control instruction
无条件转移指令JMP
Unconditional jump instruction
使程序无条件地转移到指令中指定的目的地去执行
有效地址存入IP, 段地址存入CS
分类:
第一种类型:段内转移或近(NEAR)转移
转移指令的目的地址和JMP指令在同一代码段中,转移时仅改变IP寄存器的内容,段地址CS的值不变。
直接:
短跳转 JMP SHORT 标号
程序转移到 LABEL指明的指令处继续执行。SHORT 为属性说明符, 说明转移范围,以当前 IP 为中心,转移范围-128~+127
近跳转 JMP NEAR PTR 标号
程序转移到 LABEL 指明的指令处继续执行。NEAR 为属性说明符, 说明转移范围,以当前 IP 为中心,转移范围-32768~+32767
间接:
JMP BX
将 BX 的值传送给 IP,程序转移到 CS:IP 处继续执行。操作数可以是所有 16 位 通用寄存器。
操作数必须是 16 位。
JMP WORD PTR [SI]
从[BX+DI]指明的内存区域连续取出两个字节传送给 IP,程序转 移到 CS:IP 处继续执行。操作数可以采用各种寻址方式。
操作数必须是 16 位。
第二种类型:段间转移,又被称为远(FAR) 转移
转移指令的目的地址和JMP指令不在同一段中,发生转移时,CS和IP的值都要改变——程序要转移到另一个代码段去执行。
直接转移:JMP FAR PTR 标号
程序转移到 LABEL 指明的指令处继续执行,LABEL 为标号。FAR 是 相对于 NEAR 的属性说明符,FAR 说明标号 LABEL 在另外的代码段,与 JMP 指 令本身不在同一段。这条指令执行的操作是 IP←LABEL 的偏移地址,CS←LABEL 所在段的段基址,程序转移到 CS:IP 处继续执行
间接转移:JMP DWORD PTR [DI]
从 [BX+DI]指明的内存区域连续取出 4 个字节,前两个字节(低 地址)传送给 IP,后两个字节送给 CS,程序转移到 CS:IP 处继续执行。操作数属 于存储器操作数,可以采用各种存储器的寻址方式
条件转移指令JCC
Conditional jump instruction
条件转移指令先测试条件,若条件成立则执行转移操作;若不成立则不转移并顺序执行下一条指令。所有的条件转移指令转移范围-128~+127,属于段内短转移,都不影响状态标志位
循环指令LOOP
Loop control instructions
LOOP 标号
先MOV CX(CX为计数寄存器), N(循环次数)
CX = CX-1
CX是否为0
为0则跳出循环继续运行
不为0则跳转到标号处继续执行
过程调用和返回指令CALL/RET
Procedure call and return
call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计