nullnull 指令系统一、IBM PC(8086/8088) 指令系统 二、数据传送指令三、算术运算指令 四、逻辑运算指令五、串操作指令六、控制转移指令七、处理机控制指令null一、IBM PC(8086/8088) 指令系统 8086/8088 指令系统可分为六组:
数据传送指令
算术指令
逻辑指令
串处理指令
控制转移指令
处理机控制指令 二、数据传送指令 二、数据传送指令 1. 通用数据传送指令 (1) 基本传送指令 MOV d, s ;ds
源操作数s——寄存器、存储器、立即数
目的操作数d—— 寄存器、存储器
执行的操作:d s Rs(cs不可变)1. 通用数据传送指令Move
Copy from d to snullR-R:CPU内部寄存器之间的数据传送
MOV AL,BL MOV DX, DI
MOV SI, BP MOV DS, BX
MOV AX,DX
RData:立即数传送到CPU内部通用寄存器组(AX,BX,CX,DX,BP,SP,DI,SI)
MOV CL, 4
MOV DX, 03FFH
MOV DI, 04BFH
• R-M:CPU内部寄存器(除CS,IP外)与存储器(所有寻址方式)之间的数据传送
MOV BX, BUFFER MOV [DI], CX
MOV AL, [2000] MOV SI, BLOCK[BP]
MOV AX, [SI] MOV DS, DAT[SI+BX]
• M<-Data: 立即数给存储单元赋值
MOV WORD PTR[2000], 10
MOV BYTE PTR[BX+DI], 30
实例:null注意事项:
1. RsX-Data:立即数不能直接送段寄存器,MOV DS, 3000H
2. DataX-.. :目标操作数不允许用立即数方式,MOV 2000H, AL
3. M-X-M:不允许在两个存储单元间传送数据,MOV [2000H],[3000H]
4. Rs-X-Rs:不允许在两个段寄存器之间传送数据,MOV DS, ES
5. MOV 指令不影响标志位Flags。
6. CS不可变: MOV CS, AXMov AL, AREA1
Mov AREA2, AL例1: 把地址为AREA1(段内偏移量)的存储单元的内容,传送至同一段内的地址为AREA2的存储单元中。null例2:若要传送的不是一个字节,而是一个数据块,(例如内有100个字节),如何实现?null (2)堆栈操作指令 PUSH s ;stacks
POP d ;dstack
d,s = Rc16;Rs;M16 堆栈——按照先进后出的原则组织的一段内存区域。8086中规定堆栈设置在堆栈段(SS段)内,堆栈指针SP的初值决定了堆栈的大小。
SP始终指向堆栈的顶部,即始终指向最后推入堆栈的信息所在的单元。 nullPUSH AX
指令分两步执行:
1. 先SP-1SP,将AH内容送至SP所指单元;
2. 再SP-1SP,将AL内容送至SP所指单元;
例:MOV AX,1234H
PUSH AX
nullPOP AX
指令分两步执行:
1. 先将SP所指单元内容送至AL, 然后
SP+1SP ;
2. 再SP所指单元内容送至AH, 然后
SP+1 SP
例:MOV AX,5678H
POP AX
null在寄存器间或寄存器与存储器间交换信息(不允许使用段寄存器)。
源操作数: 寄存器、存储器
目的操作数:寄存器、存储器
执行的操作:d s
例: XCHG BX, [BP+SI]
(BX)=6F30H
(BP)=0200H
(SI)=0046H
(SS)=2F00H
(2F246H)=1234H (3)交换指令 XCHG d, s ; ds
XCHG s ;AXs
Exchange values
of two operands null功能: 将AL指向的换码
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
中的一个字节的内容送到AL中。
操作数:隐含的寄存器 BX , AL
操作: AL [BX+AL]
MOV AL, 01H
MOV BX, 2000H
XLAT
(4)换码指令 XLAT ; AL [BX+AL] XLATB
ALM[BX+AL]Translate byte
from table null• 该地址常用来设置一个16位的寄存器作为地址指针;
• 该指令的执行效果与mov reg , offset src相同。
例:LEA bx, [bx][si]
执行前 (bx)=1000h
(si)=2000h
执行后 bx=1000h+2000h=3000h2. 地址传送指令(LEA, LDS, LES) 目的:把地址传送到指定寄存器。Load Effective
Address null把源操作数指定的内存的4个相继字节的内容送至指定寄存器及DS中
(1) 该指令完成一个32位地址指针的传送;
(2) 该指令通常指定 SI 作寄存器 REG。
例: LDS SI, [0100h]
DS=1000h10100h00
02
00
20 0200h 2000hSIDS (2)指针送寄存器及DS指令
LDS d, s ; d [s] , DS[s+2]
Load memory double word into
word register and DS null把源操作数指定的内存的4个相继字节的内容送至指定寄存器及ES中。
(1) 该指令完成一个32位地址指针的传送;
(2) 该指令通常指定 DI 作寄存器 REG。
例: LES DI, [100h]ES=1000h10100h00
02
00
20 0200h 2000hDIES (3)指针送寄存器及ES指令
LES d, s ; d [s] , ES[s+2]
Load memory double word into
word register and ES null3. I/O传送指令 PC机中,所有I/O端口与CPU之间的通信都有IN, OUT指令完成。Input from port
into AL or AX Output from AL or AX
To port
null4.标志寄存器传送指令 (1)读取标志指令 LAHF ;AH Flags 的低字节 (2)设置标志指令 SAHF ;Flags 的低位字节 AH注:该指令影响标志位 Z、A、P、CLoad AH from 8 low bits
of Flags register Store AH register into
low 8 bits of Flags register null (3)标志寄存器入栈指令 PUSHF ;stack Flags (4)标志寄存器出栈指令 POPF ;Flags stack将标志寄存器 Flags 的内容压入堆栈保存。16位Flags入栈。把栈中内容弹出至标志寄存器 Flags。出栈到Flags 16位。注:该指令影响标志位 O、S、Z、A、P、C 。Store flags register
in the stack Get flags register
from the stack null (3)所有Rc16入栈指令 PUSHA ;stack all Rc16 (4)所有Rc16出栈指令 POPA ;all Rc16 stackPUSH AX
PUSH CX
PUSH DX
PUSH BX
PUSH SP
PUSH BP
PUSH SI
PUSH DI POP DI
POP SI
POP BP
POP xx (SP value ignored)
POP BX
POP DX
POP CX
POP AX Push all general purpose registers AX, CX, DX, BX, SP, BP, SI, DI in the stack. Original value of SP register (before PUSHA) is used. Pop all general purpose registers DI, SI, BP, SP, BX, DX, CX, AX from the stack. SP value is ignored, it is Popped but not set to SP register). 80186 以后的CPU有: 三、算术运算指令三、算术运算指令null 注:
该指令影响标志位
该指令适合有符号数和无符号数的运算。 d+s O S Z A P C0 0 1 0 0 1 0 0 0 1.加法指令(1)加法 ADD d, s ;dd + s ADDnull例1:MOV DX, 4652H
ADD DX, 0f0f0h 4 6 5 2
+ f 0 f 0
3 7 4 2
1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0
+ 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1
1执行后: (DX) = 3742H
z=0 s = 0 c= 1 o = 0
对无符号数 溢出 结果错
对有符号数 不溢出 结果正确
问: 对带符号数和无符号数怎样判断是否溢出? 无符号数的溢出用进位标志 c 判断。null 注:
该指令影响标志位
该指令适合有符号数和无符号数的运算。 d+s+C O S Z A P C0 0 1 0 0 1 0 0 0 (2)带进位加 ADC d, s ;dd+s+C 功能: 主要用于多字节运算Add with Carrynull例:在内存的First和Secontd开始的区域中分别
存放着2F365H和 5E024 H两个数,要求求
其和,并存入Third中。
2 F 3 6 5
+ 5 E 0 2 4
8 D 3 8 9
nullMOV AX, First
ADD AX, Second
MOV Third, AX
MOV AX, First+2
ADC AX, Second+2
MOV Third+2, AX
2 F 3 6 5 F 3 6 5
+ 5 E 0 2 4 + E 0 2 4
8 D 3 8 9 D 3 8 9
1
0 0 0 2
+ 0 0 0 5
0 0 0 821First
Second
Third65
F3
02
00
24
E0
05
00
89
D3
08
00
null 用于在循环中修改地址指针及循环次数等。
注:该指令影响标志位
例: INC BX
INC [SI]
注意: (1) 该指令将操作数视为无符号数;
(2) 该指令不影响 进位标志 C OPRD + 1 O S Z A P0 0 1 0 0 1 0 0 0 (3)加1 INC d ;dd+1 Increment null 注:
该指令影响标志位
该指令适合有符号数和无符号数的运算。 d+s O S Z A P C0 0 1 0 0 1 0 0 0 2.减法指令(1)减法 SUB d, s ;dd - s Subtractnull 注:
该指令影响标志位
该指令适合有符号数和无符号数的运算。 d+s+C O S Z A P C0 0 1 0 0 1 0 0 0 (2)带借位减法 SBB d, s ;dd - s- C 功能: 主要用于多字节运算Subtract with Borrownull注意: 同加法指令 有符号数的溢出用溢出标志 O判断;
无符号数的溢出用进位标志 C 判断。
例: SUB DH, [BP+4] (DH)=41H
(SS)= 0000H (BP)=00E0H
(00E4H)= 4AH结果: (DH)=0E7H
S=1 Z=0 C=1 O=0
如果为有符号数则结果正确(无溢出)
如果为无符号数则结果错误(有溢出) 4 1
- 4 A
E 7
0 1 0 0 0 0 0 1
- 0 1 0 1 1 0 1 0
1 1 1 0 0 1 1 1
11null例3: 双精度数运算 W=X+Y+24-ZX
Y
Z
W65
F3
02
00
24
E0
05
00
89
D3
08
00
null 用于在循环中修改地址指针及循环次数等。
注:该指令影响标志位
例: DEC BX
DEC [SI]
注意: (1) 该指令将操作数视为无符号数;
(2) 该指令不影响 进位标志 C OPRD + 1 O S Z A P0 0 1 0 0 1 0 0 0 (3)减1 DEC d ;dd-1 Decrement null
注意: 该指令影响 标志位 OPRD + 1 O S Z A P0 0 1 0 0 1 0 0 0 (4)取反加1 NEG d ;d/d+1 Negate null 该指令影响标志位
(1)该指令同SUB , 但其不保存运算结果;
(2) 该指令后面通常跟一条转移指令,根据标志位产生不同的程序分支。
d+s+C O S Z A P C0 0 1 0 0 1 0 0 0 (5)比较 CMP d, s ; d – s Compare null比较指令主要用于两个数之间的关系:大、小、相等。
如:A, B
1. 比较相等。 只要看Z 标志。Z=1——相等
Z=0——不相等。
2. 比小大小。
分两种情况。
• 无符号数 看进(借)位C 标志。C=1,有借位,则 A
B
A=A0H 1 0 1 0 0 0 0 0 A=53H 0 1 0 1 0 0 1 1
B=53H - 0 1 0 1 0 0 1 1 B=A0H - 1 0 1 0 0 0 0 0
0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1
A>B AB
S=1 AB
S=0 AB
S=1 AB
O⊕ S =1 ACXCX=0?结束流程图null MOV SI, Offset BCDBUF
MOV DI, Offset ASCⅡ BUF
MOV CH, Count
Again: MOV AL, [SI]
INC SI
MOV BL, AL
AND