You are on page 1of 53

知识单元三(第五章)

Pentium微处理器的指令系统

1 2021/4/15
5.1 指令格式
格式:前缀、操作码、寻址方式、偏移量、立即数

2 2021/4/15
5.2寻址方式
操作数类型:
寻址方式是指在指令中操作数的表示方式 。 立即数、
寄存器、
5.2.1数据的寻址方式 存储器。
字节、字、双字和4倍字数据类型存储规定:

字节,8位二进制数,占1个地址单元。

字,16位二进制数,占用2个连续地址单元。

双字,32位二进制数,占4个连续地址单元。

4倍字,64位二进制数,占8个连续地址单元。

低序字节存在低位地址,高序字节存在高位地址(小端模
式,Little-endian)),将最低序字节地址作为其地址。

3 2021/4/15
1.立即寻址

操作数包含在本条指令代码中,是指令的一部分,完整
地取出该条指令之后也就获得了操作数。

例: MOV AL,12H

2.寄存器寻址

操作数在CPU的某个寄存器中,指令代码中指定寄存
器号。

例: MOV AL,BL

4 2021/4/15
3.存储器寻址

存储器寻址的操作数在存储器中,处理器要访问存储器操
作数,必须先计算操作数的物理地址。

物理地址通过段基址和段内偏移(有效地址)确定。

指令中给出的是有效地址的信息。 逻辑地址、物理地址;
段地址、段内偏移地址;
(1)有效地址的计算方法 有效地址。

Pentium有效地址的计算:

EA=基址+(变址×比例因子)+位移量

5 2021/4/15
有效地址可以由以下4部分组成:

基址:是存放在基址寄存器中的内容。

变址:是存放在变址寄存器中的内容。

比例因子:是80386以上微机新增加的寻址方式,其值
可为1,2,4或8。

位移量:是存放在指令中的一个0位、8位、16位或32
位的数,但它不是立即数,而是一个地址(地址的一部分)。

8086的有效地址: 基址+变址+相对寻址
𝐵𝑋 𝑆𝐼 8
+ + 位移量
𝐵𝑃 𝐷𝐼 16
6 2021/4/15
(2)存储器寻址方式

寻址方式 基址 变址 比例因子 位移量


1.直接寻址 V
2.寄存器间接寻址 V* V*
3.寄存器相对寻址 V* V* V
4.基址变址寻址 V V
5.相对基址变址寻址 V V V
6.比例变址寻址 V V
7.基址比例变址寻址 V V V
8.相对基址比例变址寻址 V V V V
9.相对比例变址寻址 V V V

*:只取其中一个
7 2021/4/15
(3)寻址方式的段约定和段超越

存储器寻址时规定,如果使用寄存器BP、EBP和ESP参
与寻址,默认为是访问堆栈段SS。

使用除寄存器BP、 EBP和ESP以外的所有通用寄存器参
与寻址,默认为是访问数据段DS。

如果访问的段与默认的段不同,地址表达式中必须明确
写出相关逻辑段的段超越前缀(否则,将出现寻址错误)。

取指令操作默认的段为CS

8 2021/4/15
5.2.2 转移地址的寻址方式
控制转移指令使程序不再顺序执行,按指令中给出的操作
数转移到相应的目的地址;

控制转移指令中的操作数是转移的目的地址,称为转移地
址。

段内~只改变IP/EIP

段间~改变CS、IP/EIP

相对~IP/EIP加位移量

直接~指令中给的是存储器单元地址(有效地址)

间接~指令中给出的是寄存器或存储单元地址,其内容是一
个地址。
9 2021/4/15
1.段内相对寻址
对于16位指令模式转向的有效地址是当前IP寄存器的内容
和指令中指定的8位或16位位移量之和;

而对于32位指令模式转向的有效地址是当前EIP寄存器的
内容和指令中指定的8位或32位位移量之和。
2.段内间接寻址
目标的有效地址是一个寄存器或是一个存储单元的内容。
3.段间直接寻址
段间~修改CS、及IP/EIP
在指令中直接提供了目标地址的段地址和偏移地址。
4.段间间接寻址
用存储器单元中的内容来取代IP/EIP和CS中的值。
10 2021/4/15
5.2.3 堆栈地址寻址
堆栈是以“先进后出”方式工作的一个特定的存储区。

堆栈它必须存在于 堆栈段SS中 。

使用PUSH指令将操作数压入堆栈,

使用POP指令从堆栈中弹出操作数。

X86 处理器堆栈的基本特点:

向低地址生长;
(入栈)先指针后存数,出栈;先取数后变堆栈指针;
按照数据类型(数据的字节数)修改指针,字操作加 /
减 2 ,双字操作加 / 减 4 。
11 2021/4/15
5.3 指令系统
Pentium微处理器的指令按功能可分为:

数据传送指令、算术运算指令、BCD码调整指令、逻辑运
算指令、位处理指令、控制转移指令、条件设置指令、串操
作指令、处理器控制指令和保护模式系统控制指令。

指令学习注意:

格式、功能、使用了什么资源、改变了哪些寄存器存储器。

12 2021/4/15
5.3.1 数据传送类指令

数据传送指令的功能是,把源操作数传送到目标寄存器
或目标存储单元中。

指令执行后,源操作数不变,不影响状态标志(标志寄
存器传送指令除外)。

1. MOV 传送指令 注意标红色的指令


格式:MOV DST,SRC

式中DST为目的操作数,SRC为源操作数。

功能:(DST)←(SRC)
13 2021/4/15
14 2021/4/15
2.MOVSX 符号扩展传送指令

格式:MOVSX DST, SRC

功能: (DST) ←符号扩展(SRC)

3.MOVZX 零扩展传送指令

格式:MOVZX DST, SRC

功能: (DST) ←零扩展(SRC)

15 2021/4/15
4.PUSH进栈指令

格式:PUSH SRC

功能:堆栈栈顶 ←(SRC),修改SP、栈顶单元;

过程 (16位,入栈2个字节):SP←SP-2, [SP] ←(SRC)

5.POP出栈指令

格式:POP DST

功能:(DST) ←堆栈栈顶内容,修改SP;

过程 (16位,入栈2个字节):(SRC) ←[SP] ,SP←SP+2

16 2021/4/15
16.LEA 有效地址送寄存器指令 初始化地址指针,
SRC为存储器类型
格式:LEA REG,SRC 操作数。

功能:REG ←(SRC)的有效地址
典型用法例:

LEA SI,Table ;Table为表的初始地址(变量)

( SI )=2000H
变量 逻辑地址
MOV SI ,Table
Table 00H 1000:2000H
( SI )= 0100H
01H
04H 1000:2002H
LEA BX,[2002H] 09H
17
MOV BX, [2002H] 10H 2021/4/15
20.XLAT 换码指令 往往用于查表

格式:XLAT

功能:AL<=[(BX)+(AL)]

例:

LEA BX,Table 变量 逻辑地址

MOV AL,3 Table 00H 1000:2000H

XLAT 01H
04H
Table=2000H;
09H
AL=09H 10H
18 2021/4/15
21.IN/OUT 输入/输出指令

(1) IN 输入指令 A为AL或AX;

格式:IN A, PORT PORT为端口地址,


为8位无符号数,或DX
功能:AL←(PORT)(字节)

AX ←( PORT+1, PORT)(字)

例:

IN AL,80H ;从地址为80H的端口输入一个字节数

IN AL,DX ;从地址为(DX)的端口输入一个字节数

19 2021/4/15
(2)OUT 输出指令 A为AL或AX;

格式:OUT PORT, A PORT为端口地址,


为8位无符号数,或DX
功能: (PORT) ←(AL) (字节)

(PORT+1, PORT) ← (AX)(字)

例:

MOV AL,12H

OUT 80H,AL ;向地址为80H的端口输出字节 12H

20 2021/4/15
5.3.2 算术运算指令

(1) ADD 加法指令 注意对标志位的影响,


影响所有标志位
格式:ADD DST, SRC

功能:(DST)←(SRC)+(DST)

例:ADD AX,DX ;DX和AX的内容相加,和存入AX

(2) ADC 带进位加法指令


应用:多字节/字加法
格式:ADC DST, SRC

功能:(DST)←(SRC)+(DST)+CF

例:ADC AX,DX ;DX和AX的内容相加,在末位加CF,


21 和存入AX 2021/4/15
(3) SUB 减法指令

格式:SUB DST, SRC

功能:(DST)←(DST)-(SRC)

(4) SBB 带借位减法指令

格式:SBB DST, SRC

功能:(DST)←(DST)-(SRC)-CF

22 2021/4/15
例5.3.8
MOV DX,7408H
ADD DX,0B809H

最低8位

23 2021/4/15
(5) INC 加1指令 影响标志位,
但不影响进位标志CF;
格式:INC OPR 可用于计数;
OPR可以是寄存器或存
功能:(OPR) ←(OPR)+1 储器类型操作数
例:
INC CX ;CX的内容加 1,结果存入CX

(6) DEC 减1指令


格式:DEC OPR
功能:(OPR)←(OPR)-1
例:
DEC SI ; SI的内容减 1,结果存入SI
24 2021/4/15
(8) CMP 比较指令 两数相减,结果不回存,影响
标志位,对标志位的影响与
格式:CMP OPR1,OPR2 SUB指令相同

功能:(OPR1)-(OPR2)
编程中的应用:与条件转移指
令配合实现 IF ----THEN---

例:

CMP AL,80H ;(AL)- 80H,结果影响标志位

JE L ; 如果AL的内容等于80H,就转到标号 L

L : …

25 2021/4/15
(12) MUL 无符号数乘法指令 为什么加减法指令没有区
分有符号数和无符号数?

格式:MUL SRC 一个操作数隐含在累加器


功能:字节乘 AX ←(AL)×(SRC)
当乘积的高部分为0时,
字乘 DX:AX ←(AX)×(SRC)
CF、OF为0;
否则CF、OF为1;识别是
否高字节/字有有效数据
例:

MUL BL ; AL的内容与BL的内容按无符号数相乘,结果存入AX

MUL CX ;A X的内容与CX的内容按无符号数相乘,
结果存入DX:AX(高16位在DX,低16位在AX)
26 2021/4/15
(13) IMUL 带符号数乘法指令

格式1:IMUL SRC

功能:字节乘 AX ←(AL)×(SRC)

字乘 DX:AX ←(AX)×(SRC)

双字乘 EDX:EAX ←(EAX)×(SRC)

当乘积的高部分为符号扩展时,CF、OF为0;
否则CF、OF为1。
其它与MUL相同。

27 2021/4/15
(14) DIV 无符号数除法指令

格式:DIV SRC 被除数隐含在累加器


功能:
字节除: AL ←(AX)/(SRC)的商, 被除数的长度是除数的
AH ←(AX)/(SRC)的余数 双倍,被除数的高半部
字除: 分绝对值大于除数时,
产生溢出(除零异常),
AX ←(DX:AX)/(SRC)的商,
触发0号中断。
DX ←(DX:AX)/(SRC)的余数

例:
MOV AX, 13 ;十进制数13
MOV CL, 05
DIV CL ;商02在AL中,余数03在AH中

28 2021/4/15
(15) IDIV有符号数除法指令

格式:IDIV SRC

功能: 与DIV指令相同,

除数、被除数、商都是有符号数,

余数属性与被除数同。

其它与DIV相同

29 2021/4/15
5.3.3 BCD码调整指令
(1) DAA 压缩BCD码加法调整指令

格式:DAA 在加法后使用,实现十进制加法

功能:

如果AL的低4位大于9或AF=1,则(AL)+6→AL和
1→AF;如果AL的高4位大于9或CF=1,则(AL)+60H→AL和
1→CF 。

例:
MOV AL,36H BCD码36H(十进制36)与
ADD AL, 48H ; (AL)=7EH 48H(十进制48),结果应当为
DAA ; (AL)=84H BCD码84H(十进制84)
30 2021/4/15
5.3.4 逻辑运算指令
逻辑运算指令对操作数按位进行计算,操作数可以是字
节或字,也可以是双字。影响标志位

(1) AND 按位逻辑与运算指令


测试字段:
MOV AL,78H
格式:AND DST,SRC
AND AL,80H

功能:(DST) ←(DST)∧(SRC) 提取字段


MOV BL, 34H
(2) OR 按位逻辑或运算指令 AND BL, 0FH

格式:OR DST,SRC 拼接字段


MOV BL, 30H
功能:(DST) ←(DST)∨(SRC) MOV AL, 04H
OR AL,BL
31 2021/4/15
(3) XOR 按位逻辑异或运算指令

格式:XOR DST,SRC

功能: (DST) ←(DST)⊕(SRC)

(4) TEST 按位逻辑比较运算指令 两数相与,结果不回存,


影响标志位
格式:TEST OPR1,OPR2
测试字段:
功能:(OPR1)∧(OPR2) MOV AL,78H
TEST AL,80H
(5) NOT按位取反指令 AL的内容不变,标
志位变化
格式:NOT OPR

功能:(OPR) ←(OPR)按位取反
32 2021/4/15
5.3.5 位处理指令
OPR为寄存器或存储
(7) SHL 逻辑左移指令 器操作数;CNT为8位立即
数或CL,给出移位次数
格式:SHL OPR,CNT

功能:如图

(8) SAL 算术左移指令

格式:SAL OPR,CNT 两者操作相同,含义不同

功能:如图

33 2021/4/15
(9) SHR 逻辑右移指令

格式:SHR OPR,CNT

功能:如图

(10) SAR 算术右移指令

格式:SAR OPR,CNT

功能:如图

34 2021/4/15
5.3.6 控制转移指令
怎么修改CS、IP

条件/无条件,段内/段间,绝对/相对,直接/间接,短/近/远

2. 无条件段内相对近转移指令 OPR是操作数。
汇编语言一般使用标号
格式:JMP NEAR PTR OPR
,由汇编过程生成对应
功能:IP←(IP)+16位位移量 的代码。

一般格式:
JMP L
L为标号

35 2021/4/15
3. 无条件段内间接转移指令 OPR为寄存器,寄存器的
内容送IP;当OPR为存储器
格式:JMP OPR ,存储单元字数据送IP
例:
功能:IP←由OPR表示的有效地址(EA) JMP BX
(BX)送IP

JMP WORD PTR [2000H]


4. 无条件段间直接转移指令 字存储单元2000H内容送
IP
格式:JMP FAR PTR OPR
例:
功能 :IP←OPR的段内偏移地址 JMP FAR PTR L
标号 L 的段地址送CS,段
CS←OPR 的段地址 内偏移地址送IP

36 2021/4/15
6.条件相对转移指令
条件就是标志位的状态,
(1) 单条件相对转移指令 都是段内短转移
① JZ/JE OPR ;ZF=1转移(结果为零或相等转移)

② JNZ/JNE OPR ;ZF=0转移(结果不为零或不相等转移)

③ JS OPR ;SF=1转移(结果为负转移)

④ JNS OPR ;SF=0转移(结果为正转移) 例:


⑤ JO OPR ;OF=1转移(结果溢出转移) MOV AL,56H
⑥ JNO OPR ;OF=0转移(结果不溢出转移) CMP AL, 80H

⑦ JP/JPE OPR ;PF=1转移(结果为偶转移) JC L



⑧ JNP/JPO OPR ;PF=0转移(结果为奇转移)

⑨ JC OPR ;CF=1转移(有借位或有进位转移)
L:…
⑩ JNC OPR ;CF=0转移(无借位或无进位转移)
37 2021/4/15
(2)无符号数比较条件相对转移指令(A-B) 应用:
CMP A,B
① JB/JNAE/JC OPR ;CF=1 (A<B转移)
比较A、B两数(相
② JAE/JNB/JNC OPR ;CF=0 (A≥B转移) 减),把关系变成
标志位状态。
③ JBE/JNA OPR ;(CF∨ZF)=1 (A≤B转移)
根据标志位状态决
④ JA/JNBE OPR ;(CF∨ZF)=0 (A>B转移) 定是否转移。

例: 指令本身是否转移
MOV AL, 56H 只取决于标志位,
CMP AL, 80H 无论标志位是怎么
形成的。
JBE L ;(AL)小于等于80H转移到L


L:…
38 2021/4/15
(3) 有符号数比较 条件相对转移指令(A-B)
① JL/JNGE OPR ;(SF⊕OF)=1 (A<B转移)
② JGE/JNL OPR ;(SF⊕OF)=0 (A≥B转移)
③ JLE/JNG OPR ;((SF⊕OF) ∨ZF)=1 (A≤B转移)
④ JG/JNLE OPR ;((SF⊕OF) ∨ZF)=0 (A>B转移)

例:
MOV AL,56H
CMP AL, 80H
JLE L ;有符号数(AL)小于等于80H转移到L


L:…

39 2021/4/15
7. LOOP 循环控制相对转移指令
格式:LOOP OPR
功能:CX/ECX←(CX/ECX)-1;(CX/ECX)≠0转移

典型用法:
MOV CX, n ;循环n次
L : …

LOOP L

40 2021/4/15
10.子程序调用与返回指令 汇编语言中,一般格式:
CALL 子程序名
(1)段内相对调用指令
汇编程序,根据子程序情况
格式:CALL DST 生成对应指令。
或: CALL NEAR PTR DST
功能:当操作数长度为16位时, 调用指令基本执行过程:
(SP)-2→SP,(IP) →[SP], 1、返回地址压入堆栈;
2、根据操作数形成目标地址,并
IP ←(IP)+16位位移量
把目标地址偏移地址送IP(如果是
段间转移,再把段地址送CS)。
例:
CALLSUB1
保护返回地址,根据目标地址SUB1得到16位位移量送IP。

41 2021/4/15
(3)段间直接调用指令 汇编程序中DST为远过程名(定
格式:CALL DST 义为FAR类型的子程序)。
功能:(SP)-2→SP, (CS) →[SP]
(SP)-2→SP, (IP) →[SP] 段间返回地址压入堆栈;
IP ←DST的偏移地址

CS←DST所在段的段地址 目标地址送CS:IP

例:

CALL SUBF

子程序SUBF的类型为FAR,则返回地址段内偏移、段地址
保护到堆栈,SUBF段内偏移送IP,段地址送CS。

42 2021/4/15
(5)段内返回指令 类型为NEAR的过程中的返回指令
格式:RET 堆栈栈顶弹出返回地址送IP

功能: IP←堆栈弹出2字节,
(SP)+2→SP

(6)段内带参数返回指令
栈顶 返回地址L
格式:RET N 返回地址H
参数1
功能:IP←栈弹出2字节,
参数2
(SP)+2→SP …
原栈顶 …
SP ←(SP)+N …
带参数~用堆栈传递参数 …
43 2021/4/15
(7)段间返回指令

格式:RET

功能:IP←栈弹出2字节, 与段内返回怎么区别?
助记符相同,代码不同.
(SP)+2→SP, 过程说明/定义时,如果为远
过程(FAR类型),其返回
CS←栈弹出2字节, 指令按段间返回指令处理。
(SP)+2→SP

44 2021/4/15
11.中断指令
(1)INT 中断指令 8086、实模式中断响应过程
格式:INT n
功能:① SP←(SP)-2
② PUSH (FR) ;标志寄存器进栈 保护现场
③ SP←(SP)-2
④ PUSH (CS) ;断点段地址进栈
⑤ SP←(SP)-2 保护断点
⑥ PUSH (IP) ;断点地址指针进栈 (返回地址)
⑦ TF←0 ;禁止单步
⑧ IF←0 ;禁止中断
⑨ IP←[n×4] ;转向中断服务程序 从中断矢量表取中断
⑩ CS←[n×4+2] 服务程序入口地址送
CS:IP,转入中断
45 服务程序 2021/4/15
(4)IRET中断返回指令

格式:IRET

功能: ① IP←栈弹出2字节 ;断点地址出栈 恢复断点

② SP←(SP)+2

③ CS←栈弹出2字节

④ SP←(SP)+2

⑤ FR←栈弹出2字节 ;标志寄存器出栈 恢复现场

⑥ SP←(SP)+2

46 2021/4/15
参考书后附录B
(6)INT 21H 系统功能调用指令

系统功能调用是DOS为系统程序员及用户提供的一组
常用中断服务程序。
DOS规定用中断指令 INT 21H 作为进入各功能调用
中断服务程序的总入口,再为每个功能调用规定一个功能
号,以便进入相应各个中断服务程序。

使用系统功能调用的过程是:

① 把功能调用编号置于寄存器AH中,
② 设置入口参数,
③ CPU执行 INT 21H,

47
④ 从出口获得结果参数。
2021/4/15
DOS共提供了约80个功能调用

几个常用的DOS系统功能调用的功能及使用方法:

① 功能号:1

格式:MOV AH,1 ;功能号01H→(AH)

INT 21H ;调用21H软中断

功能:等待键盘输入,并回送显示器。

说明:等待按键。出口参数(AL)=键入字符的ASCII码。

48 2021/4/15
② 功能号:2
格式:MOV AH,2 ;功能号02H→(AH)
INT 21H ;调用21H号软中断
功能:输出字符送显示器。
说明:入口(DL)=输出字符的ASCII码,无出口参数。

例:
MOV DL,41H ;字符 A 的ASCII码送→DL
MOV AH,2 显示字符’A’

INT 21H

49 2021/4/15
③ 功能号:4CH

格式:MOV AH,4CH ;功能号4CH→(AH)

INT 21H ;调用21H号软中断

功能:终止程序,返回。

50 2021/4/15
5.3.9 处理器控制指令
1.标志处理指令

标志处理指令只设置或清除本指令的标志位,而不影响
其他标志位。
(1)CLC 进位位置0指令
功能:CF←0
(3)STC 进位位置1指令
功能:CF←1
(6)CLI 允许中断标志置0指令
功能:IF←0
(7)STI允许中断标志置1指令
51 功能:IF←1 2021/4/15
(6)CLI 允许中断标志置0指令
功能:IF←0
(7)STI允许中断标志置1指令
功能:IF←1

52 2021/4/15
2.处理器控制指令

(1) HLT暂停指令
退出:中断、DMA、复位

(2) NOP 无操作指令


(3) ESC换码指令
(4) WAIT等待指令
处理器空转。可响应中断,中断后返回本指令。

(5) LOCK封锁指令

53 吉林大学 微型计算机原理与接口技术
2021/4/15

You might also like