第三章 指令系统
3.1.2 指令系统
3.1.2
8086微处理器的指令系统
指令系统可分为如下几类: 1.数据传送类 2.算术运算类 3.逻辑运算与移位指令 4.字符串处理 5.控制转移指令 6.处理器控制指令
1.数据传送类(P89表3-3)
要求掌握的指令: MOV PUSH POP XCHG
XLAT LEA IN OUT
14. OUT指令(输出指令) 格式:OUT port,A 功能: (port) ←AL 或 (port+1)_(port) ← AX
二、算术运算指令
ADD ADC INC SUB SBB DEC NEG CMP MUL IMUL DIV 加法 带进位的加法 加1 减法 带进位的减法 减1 求补 比较 无符号数乘法 有符号数乘法 无符号数除法
错误指令: INC [2000H] 正确指令: INC BYTE PTR[2000H] INC WORD PTR[2000H]
这样,编译系统才不会产生岐义。因为访问内存单元 时,内存单元是以字节为单位组织的,它可以访问 一个字节,也可以访问一个字,若指令中只有一个 操作数,这时就必须指明内存单元的类型。
2. ADC指令 格式:ADC dest,src (B/W) 功能:dest←dest+src+CF
3. INC指令 格式:INC dest 功能:dest←dest+1 注意: (1)该指令的执行不影响CF标志位。 (2)对内存单元进行加1时,要指明内存单元是字节, 还是字。可以在内存单元前加操作符BYTE PTR, 表明为字节;加WORD PTR表明是字。
指令运行后,AL=05H
AND指令常用来对一个数据的指定位清0。 如 AND AL,0FH ;实现将寄存器AL的高4位清0。
2、OR指令 格式:OR
dest,src (B/W) 功能:dest←dest∨src做或运算的结果 注意: (1)两个操作数不能都为存储器单元 表示的操作数。 (2)该指令会使CF,OF清0.
5. XLAT指令(查表指令) 格式: XLAT 功能: AL←(BX+AL) 注意:用XLAT指令前,需将表的首地址存入 寄存器BX。
例:将数据5查表转换为其ASCII码35H. 若在内存的某段区域放有数字0-9的ASCII码 值FSET TABLE MOV AL,5 XLAT
4. SUB指令 格式:SUB dest,src (B/W) 功能:dest←dest-src 注意:减法时OF溢出标志位何时为0,何时 为1?当负数减正数时,若结果为正数, OF=1;当正数减负数时,若结果为负数, OF=1;否则为0.
5. SBB指令 格式:SBB dest,src (B/W) 功能:dest←dest-src-CF
2. PUSH指令 格式:PUSH src (W) 功能:SP←SP-2 (SP+1)_(SP) ←src 用PUSH指令将一个字数据压入堆栈进行存储。
有关堆栈的概念 堆栈是一块特殊的内存区域,这块内存区域 按“后进先出”的原则来存取数据。它的段 基值放在SS段寄存器里,SP堆栈指针指向堆 栈的栈顶。堆栈操作有入栈和出栈,操作的 对象是堆栈指针所指的内存单元的数据。
13. DIV指令(除法指令) 格式:DIV src 功能:AL←AX/src的商 (若src为字节数据) AH←AX/src的余数 AX ←DX_AX/src的商 (若src为字数据) DX ←DX_AX/src的余数
14 IDIV指令(有符号数的除法指令) 格式和功能同DIV指令。
AL寄存器
3、NOT指令 格式:NOT dest (B/W) 功能:dest←dest 注意: 该指令不影响标志位
例:MOV AL,5 NOT AL 0000 0101 取反后:1111 1010
指令运行后,AL=FAH
4、XOR指令 格式:OR dest,src (B/W) 功能:dest←dest⊕src做异或运算的结果 注意: (1)两个操作数不能都为存储器单元表示的 操作数。 (2)该指令会使CF,OF清0.
例: IN AL,100; 表示将端口号为100的端口中的数据输入到寄存 器AL中。 IN AX,100; 表示将端口号为100和101的两个端口中的数据 输入到寄存器AX中。
例:
MOV DX,300 IN AL,DX 由于端口号为300,不能用8位二进制数表示, 所以需要先将端口号用MOV指令传送到寄存 器DX,再用IN指令输入DX表示的端口号中 的数据到寄存器AL中。
三、位处理指令 1、AND指令 格式:AND dest,src (B/W) 功能:dest←dest∧src 做与运算的结果 注意: (1)两个操作数不能都为存储器单元表示的操作 数。 (2)该指令会使CF,OF清0.
例:MOV AL,5 AND AL,7 0000 0101 ∧ 0000 0111 0000 0101
同理:同学们可自行推算出堆栈段内存单元 (11002H)=? 78H (11003H)=? 56H
3. POP指令 格式:PUSH dest (W) 功能: dest← (SP+1)_(SP) SP←SP+2 用POP指令将堆栈指针所指的两个内存单元 形成的字数据弹出到目的操作数中。dest可 以是寄存器,,段寄存器(CS除外),内存 单元(用有效地址表示)。
5、TEST指令 格式:TEST dest,src (B/W) 功能:dest与src做与运算,但其结果不保存, 运算前后,dest和src不变。 注意: (1)两个操作数不能都为存储器单元表示的 操作数。 (2)该指令会使CF,OF清0.
TEST指令常用来测试某些位是否为0,例如,若要 测试AL中的第3位是否为0,若为0则将BL置为0, 否则置BL为1. TEST AL,00001000B JZ ZERO JZ (Jump Zero的缩写)为条件跳转指令, MOV BL,1 运算结果为0时跳转.若结果非0,不满足 JMP OVER 跳转条件,程序顺序执行下一条指令。 ZERO:MOV BL,0 OVER:HLT JMP为无条件跳转指令,程序执行到该指
1.MOV指令 格式:MOV dest,src (B/W) 功能:dest←src dest为目的操作数,src为源操作数,B/W表 示操作数可以是字节数据(8位),也可以是 字数据(16位)
注意: (1)dest和src不能同时为存储器操作数; 错误指令:MOV [1000H],[2000H] 正确指令:MOV AL,[2000H] MOV [1000H],AL
(2) dest和src不能同时为段寄存器; 错误指令:MOV DS,SS 正确指令:MOV AX,SS MOV DS,AX
(3)不能对段寄存器用立即数赋初值; 错误指令:MOV DS, 1234H 正确指令:MOV AX,1234H MOV DS,AX
(4)不能用CS作dest。 编程人员是不允许对CS赋值的,其值是由操 作系统在系统运行时自动赋值的。
例: MOV AX,1234H MOV BX,5678H PUSH AX 交换寄存器AX,BX的值。 PUSH BX POP AX POP BX 试分析上述程序段的功能?
4. XCHG指令(交换指令) 格式: XCHG dest, src 功能: dest←→src 注意:dest和src不能都是mem操作数。 错误指令:XCHG [1000H],[2000H] 正确指令:MOV AL,[1000H] XCHG AL,[2000H] MOV [1000H],AL
例:MOV AL,5 XOR AL,7 0000 0101 ⊕ 0000 0111 0000 0010
XOR AL,00101110B 该XOR指令会使得和0相异或 的位保持不变,而和1相异或 的位取反。
异或运算规则: 相同为0,不同为1
指令运行后,AL=02H
XOR指令常用在一些程序的开头,可使某个寄存器清0,以 配合初始化的完成;还可用XOR指令来使指定位求反,而其 余位保持不变。 如 XOR AX,AX ;对累加器AX的清0
下面是一程序段: 假定指令执行前,有 MOV AX,1234H SS=1000H,SP=1006H. MOV BX,5678H PUSH AX 执行PUSH AX指令后,SP=1004H, PUSH BX (SP+1)_(SP)表示堆栈段的两个存 储单元,它们的有效地址分别是 这两个单元的数据为: 1004H,1005H. (11004H)=34H 用物理地址的生成办法,可以计算 (11005H)=12H 出这两个单元的物理地址是: 11004H,11005H,
AL=? 0FCH
CF=? 0
OF=?
1
OF标志位何时为0,何时为1? 当数据作为有符号数时,运算中产生溢出OF 就为1,否则就为0. 简单判断规则:正数与正数相加,若结果为 负数,说明产生了溢出,OF=1;负数与负数 相加,若结果为正数,也说明产生了溢出, OF=1. 判断一个数是正数,还是负数,只需看它的 最高二进制位,0正1负。
例:MOV AL,5 OR AL,7 0000 0101 ∨ 0000 0111 0000 0111
指令运行后,AL=07H
OR指令常用来对一个数据的指定位置1。 如 OR AL,02H ; 02H→00000010B,上面指令实现将寄存器AL的D1位置 1,而AL的其余位保持不变。
D7 D6 D5 D4 D3 D2 D1 D0