第 3章 80x86的指令系统
3.1 寻址方式
3.2 指令系统
3.1 寻址方式
数据的寻址方式
转移地址的寻址方式
保护方式下的寻址方式
3.1 寻址方式指令的寻址方式是指:指令中操作数的表示方式。
指令中的操作数有两类:
一般数据
转移地址
3.1.1 数据的寻址方式立即寻址寄存器寻址直接寻址寄存器间接寻址基址变址寻址寄存器相对寻址相对基址变址寻址带比例因子的变址寻址这是指广义的 80x86的寻址方式。
其中寄存器寻址汇编后的机器码最短,执行速度最快。
后 6种都是存储器寻址。
操作数都是内存单元中的数。
要访问存储器操作数,必须先计算操作数的物理地址。
一、立即寻址当操作数据就在指令中时,即为“立即寻址”。这种操作数称为立即数,
在指令中立即数可用 16进制数(以 H结尾),2进制数(以 B结尾)和 10进制数(不需加特殊符号)表示,
也可以使用撇号“‘”括起来的 ASCII码表达的字符和字符串。
注意,如果 16进制数以字母 A~ F打头,则必须在前面加上一个,0”,这是汇编程序的要求。
在立即寻址中,立即数为一常量,
在 8086,80286处理器中,可以是字节( 8位数)或字( 16位数),
而在 80386以上的处理器中,立即数还可以是双字( 32位数)。
8位立即数 — MOV AL,43H
MOV AL,01000011B
MOV AL,67
16位立即数 — MOV AX,4142H
MOV AX,0100000101000010B
MOV AX,16706
32位立即数 — MOV EAX,12345678H
字符或字符串 —MOV AL,‘ A’
二,寄存器寻址操作数在寄存器中,即寄存器的内容就是操作数的数据,在汇编语言表示的指令中,以寄存器符号表示之,
可用作 80X86操作数的寄存器如表 3-1
所示。
表 3-1寄存器寻址中的寄存器寄存器 操作数字长字节( 8位) 名字( 16位) 双字( 32位)
累加器 AH,AL AX EAX
基址寄存器 BH,BL BX EBX
计数寄存器 CH,CL CX ECX
数据寄存器 DH,DL DX EDX
堆栈指针 / SP ESP
基址指针 / BP EBP
源变址寄存器 / SI ESI
目的变址寄存器 / DI EDI
代码段寄存器 / CS /
数据段寄存器 / DS /
堆栈段寄存器 / SS /
E数据段寄存器 / ES /
F数据段寄存器 / FS /
G数据段寄存器 / GS /
注意,
( 1) 当指令中的源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错;
( 2) 两个操作数不能同时为段寄存器;
( 3) 目的操作数不能是代码段寄存器,例如指令 MOV CS,AX,汇编时没有出错,可得机器码为 8EC8H,但执行时会发生问题 。
三,存储器寻址
1,16位系统中的存储器寻址 ( 8086)
由段基址( SBA,Segment Base Address)和有效地址
( EA,Effective Address)组合而成。
段基址与段基值段基值是段基址的前 16位( 2进制),存放在段寄存器中,在 16位处理器中为 CS,DS,SS,ES。
关键是有效地址的计算。
由 BX/BP,SI/DI,DISP8/DISP16中任取 1,2,3
个组合而成。
16位系统中的“物理地址”与“逻辑地址”。
逻辑地址有“段基值”和“偏移地址”
两部分。偏移地址即有效地址。
注意逻辑地址的隐含约定 (见第 2章 )。
80286以及 32位微处理器在实地址方式下只能访问 1MB内存。
2,32位系统中的存储器寻址
32位处理器可访问字节、字和双字,并有 2个更大的存储单位 -段和页。
可变长度(最大 4GB)的段,可以同磁盘交换信息,可由若干程序共享。分段是应用程序员的有效工具。
页的容量为 4GB,分页是系统程序员管理一个系统的物理存储器的有用工具。
32位系统的存储器采用分段和分页的工具为系统设计员提供了极大方便。
1)三种存储器地址定义
( 1)逻辑地址:虚拟地址。
由一个 16位的段选择子和 32位偏移量组成。
16位选择子中 13位为“索引值”,每个索引值,可从段描述子表中找到 1个描述子(即找到一个存储段)。
每个表长 64KB。可存放 8K个描述子(即 8K个段),
二种表( GDT,LDT)各可表示 8K个描述子,共 16K
个描述子。
每个任务的虚拟地址可有 64TB(246)的逻辑地址。
( 2)线性地址
32位微处理器芯片内的分段部件将逻辑地址转换为 32 位的线性地址空间。
( 3)物理地址
32位微处理器芯片内的分页部件将线性地址空间转换为物理地址空间 -即处理器芯片的引脚上出现的地址。
若不允许分页操作,则分段后的 32 位线性地址即为物理地址。
2),32位寻址方式的特点
( 1)通用寄存器都可用做基址寄存器;
( 2)通用寄存器除 ESP外都可用做变址寄存器;
( 3)可以 1,2,4或 8的比例因子对变址值进行换算。
3) 9种存储器寻址方式
32位系统提供了 9种存储器寻址方式,这
9种寻址方式提供了操作数所在的存储单元的有效地址。存储单元的段基地址和有效地址 EA(即偏移地址)组成存储单元的“线性地址”( Linear Address),在 32位微处理器中,线性地址经过分页部件( PU,Paging
Unit)后生成物理地址。线性地址的形成如图 3-2所示。
段基地址由某一个段寄存器对应的描述子寄存器确定,
而有效地址 EA由基址,变址,位移量和比例因子四部分按一定表达式组合而成 。
EA = [基址寄存器 ] + [变址寄存器 ] × [比例因子 ] + [位移量 ]
式中各组成部分的说明如下:
( 1) 位移量为指令中提供的一个 8位或 16位值;
( 2) 基址寄存器通用寄存器都可用作基址寄存器,其内容即基址值,
通常为编译器所用,指向局部变量区的首地址;
( 3) 变址寄存器除 ESP之外的所有通用寄存器都可用作变址寄存器,其内容即为变址值,
变址寄存器用于访问数组元素或字符串;
( 4) 比例因子变址寄存器的值可以乘以 1,2,4或 8( 对应于操作数的长度为 1,2,4或 8个字节 ) 的比例因子,
这种寻址方式对于访问数组或结构特别有用 。
寻址方式 基址 变址 比例因子 位移量
1 直接寻址 *
2 寄存器寻址 *# *#
3 基址寻址 * *
4 变址寻址 * *
5 比例变址寻址 * * *
6 基址变址寻址 * *
7 基址比例变址寻址 * * *
8 基址变址位移寻址 * * *
9 基址比例变址位移寻址 * * * *
9种存储器寻址方式
#表示基址、变址任取一个
3.1.2 转移地址的寻址方式控制转移指令中的操作数是转移的目的地址,称为转移地址。
三种寻址方式:
直接寻址寄存器寻址存储器寻址一、直接寻址直接给出转移地址以标号(符号地址)表示。
标号的类型属性有 NEAR,FAR,SHORT。
二、寄存器寻址给出寄存器名,寄存器的内容即转移的目的地址(仅段内用)。
三、存储器寻址指令中给出内存的有效地址 EA,转移去的目的地址在数据段的内存单元中。
3.1.3 保护方式下的寻址方式一,80386的工作方式
1,实方式(实地址方式)
系统启动后,自动进入实方式。
采用类似 8086的体系结构。
主要特点:
( 1)寻址方式、存储器管理、中断处理同 8086;
( 2)操作数默认为 16位,允许访问 32位寄存器;
( 3)不使用虚拟存储器,
最大地址范围仍为 1MB,
只采用分段部件,每段最大为 64KB;
( 4)存储器中保留 2个固定的区域;初始化程序区
FFFFFH~FFFF0H,中断向量表 0003FFH~00000H。
( 5) 80386指令集中绝大多数可以运行。
2,保护方式
“保护”是指在执行多任务操作时,对不同任务使用的虚拟存储器空间进行完全的隔离,保护每个任务顺利执行。
系统启动后先进入实方式,在 CR0的 PE位 =1时,完成系统初始化后,立即转入保护方式。
这种方式提供了多任务环境下的各种复杂功能以及对复杂存储器组织的管理机制。
这是 80386最常用的方式,只有在此方式下,80386
才能发挥其固有的强大功能。
主要特点:
( 1)采用虚拟地址空间、线性地址空间和物理地址空间来描述存储器;通过描述子、选择子的数据结构来实现对内存的访问;
( 2)强大的寻址空间。每个任务的最大虚拟地址空间可达 64TB( 246);
( 3)使用 4级保护功能,可实现程序与程序、用户与用户、用户与 OS之间的隔离和保护,为多任务 OS提供优化支持;
( 4)既可进行 16位运算,又可进行 32位运算,只要在保护方式,就能启动其分页单元,以支持虚拟内存。
3,虚拟 8086方式( V86方式)
“虚拟 8086”是指一个多任务的环境,即模拟多个 8086的工作方式,在此方式下,80386被模拟成多个 8086处理器并行工作。
虚拟 8086方式允许 80386将内存划分成若干部分,
每一个部分由 OS分配给不同的应用程序,而应用程序、数据以及内存管理程序等部分则存放在所分配的内存中。因此 OS可根据“时间上的平均分配”或
“优先权”,分给每个应用程序的执行时间。
主要特点:
( 1)可执行原来采用 8086书写的应用程序;
( 2)段寄存器的用法同实方式;
( 3)可采用分页方式,将内存以 4KB为单位划分,
4KB为一“页”,比分段划分要细。从而可以处理较小的应用程序和数据段。
V86下线性地址是 20位 ---1MB空间。但由于线性地址可以通过页表映射到任何 32 位物理地址,所以应用程序可在 80386现有实际内存的任何地方执行。
在 80386多任务系统中,可以使其中一个或几个任务使用 V86方式,此时,一个任务所用的全部页面可以定位于某个物理地址空间,另一个任务的页面可以定位于其他区域,即每个 V86方式下的任务可以转换到物理存储器的不同位置,这样把存储器虚拟化了。故称为“虚拟 8086方式”。
( 4)应用程序在最低特权的 3段上运行,80386
指令系统中的特权指令不能使用。
4,实地址方式与 V86方式的主要区别这是两种类似 8086的工作方式
(1) 实方式的内存管理只采用分段,V86方式既分段又分页;
(2) 实方式的最大寻址空间为 1MB。 V86每个任务可在整个内存空间寻址,即 1MB的寻址空间可在整个存储器范围移动。 V86的实际寻址空间为 4GB。
(3) 实方式下微处理器的所有保护机制都 不起作用。不支持多任务。
V86方式既可运行 8086程序,又支持多任务操作。
V86方式可针对 80386保护方式中多任务操作的一个任务。
实方式总是针对整个 80386系统。
二、保护方式下的存储管理两大机制:
地址转换机制保护机制
1.地址转换机制使操作系统可以灵活地把存储区分配给多个任务。
虚拟地址 (逻辑地址 )空间可达 64TB(246),用户在程序中所使用的地址都是由“段选择子”和“偏移量”两部分组成的虚拟地址。
程序在系统中运行时,由存储管理机制把虚拟地址转换成物理地址。
80386以上的处理器中集成有存储管理部件 MMU(Memory
Management Unit),采用分段机制和分页机制以实现两级虚拟 -
物理地址的转换。
2,保护机制支持两个主要的保护机制
(1)通过给每个任务分配不同的虚拟地址空间,使任务之间完全隔离,每个任务有不同的虚拟地址 -物理地址的转换映射;
(2)任务内的保护机制操作,保护操作系统存储段及特别的处理器寄存器,使其不被应用程序所破坏。
两种地址空间:
局部地址空间:
由一个任务私有的虚拟地址空间,不被其他任务共享的虚拟地址部分。局部地址空间中的代码和数据是任务私有;需要与系统中的其它任务隔离。
全局地址空间:
各个任务公用的一部分虚拟地址空间。操作系统存储在此空间。使操作系统由所有任务共享,并且可以在每个任务对其进行访问时,仍保护了操作系统,使其不被应用程序破坏。
32位处理器支持 4级保护的特权级 (Privilege
Level)0~3级最内层为 0级最高。
每个存储段都同一个特权级相联系,只有足够级别的程序才可对相应的段进行访问。
特权级的典型用法见教材。
0 - 操作系统核心
1 - 操作系统的系统服务程序
2 - 操作系统扩展 -应用系统程序
3 - 应用程序一个任务的操作系统程序、中断服务程序和其它系统软件,处于不同的特权层而得到保护,
因而可与应用程序在同一地址空间内共处而不发生越权操作。
三、保护方式下的存储器寻址
1.描述子和选择子在保护方式下实现存储器操作数寻址的数据结构;
80386的分段机制段基地址、段限和其它属性
段描述子 Descriptor
用来描述对应存储段的一些基本特性保护方式下的存储器寻址段选择子 Selector
用来到描述子表中选择对应存储段的描述子。
描述子表
GDT 全局描述子表
LDT 局部描述子表
IDT 中断描述子表
Global
Local Descriptor
Interrupt
GDT
LDT 8Bytes~64KBytes
IDT 256Bytes以上。最多 256个描述子。 (为 Intel保留的 32个中断描述子 )
描述子表寄存器
GDTR - 48位寄存器
32位 Base
16位 Limit
IDTR- 48位寄存器
LDTR- 16位寄存器
选择子
15
Index TI RPL
3 2 1 0
2,寻址过程
(1) 准备工作 - 定义描述子表在实方式用 LGDT指令装入 GDTR LGDT QWORD PTR n
在保护方式,用 LLDT指令装入 LDTR
LDTR为 16位选择子
(2) 寻址
a) 给出 48位虚地址指针
47 32 31 0
Selector Offset
Selector值可由 MOV指令对 DS/SS/ES/FS/GS赋值。
Offset由指令寻址方式指定
b) 从段寄存器中取出选择子
c) 选择子中 TI=0 描述子在 GDT中进入 e)
d)选择子中 TI=1,描述子在 LDT中
从 LDTR中取出 LDT的 Selector;
从 Selector中取出 Index,× 8;
GDT的段基址 +8× Index,从 GDT中取出该 LDT的描述子;
从描述子中取出 LDT的段基址即 LDT的表基地址;
e) 取出段寄存器的选择子中的 Index× 8加到 LDT/GDT的表基地址,从 LDT/GDT中取出对应的描述子;
f) 从描述子中取出 BASE(段基地址 )
g) 48位地址指针中 Offset +BASE得 32位线性地址。
注意:
a) 在步骤 e)中 Index× 8要与表内值比较是否超过,并对描述子的 AR(Access Right)进行检查,该访问权是否合法。若通过检查,则把该描述子内容装入对应的
Cache(段描述子寄存器 )中。
b) 步骤 e)后,用已装入 Cache的访问权字节中的 TYPE
字段所规定的内容,对有关存储段引用请求进行检查;且对地址指针中的 Offset进行检查。
3.分段机制和分页机制分段机制使逻辑地址转换为线性地址;分页机制使线性地址转换为物理地址。
3.2 指令系统
8086指令概述
80386以上微处理系统的指令系统
3.2 指令系统
3.2.1 8086指令概述按功 能可分为 6大类:
数据传送指令算术运算指令位处理指令串操作指令控制转移指令处理器控制指令一,数据传送指令 (14条 )
src/s 源,dest/d 目的
reg/r 寄存器
mem/m 存储器 (内存 )
sreg 段寄存器
B 字节,W 字数据传送指令表助记符 功能通用数据传送指令
MOV 传送字节或字
PUSH 字入栈
POP 字出栈
XCHG 交换字节或字
XLAT 字节转换地址目标传送指令
LEA 装入有效地址
LDS 将指针变量装入寄存器及 DS
LES 将指针变量装入寄存器及 ES
标志传送指令
LAHF 标志寄存器低字节送 AH
SAHF AH值送标志寄存器低字节
PUSHF 标志寄存器内容进栈
POPF 标志寄存器内容出栈
I/O指令 IN 输入字节或字OUT 输出字节或字
1,MOV dest,src; B/W,d← s
S,lmm,reg,mem
d,reg,mem
s与 d不能同时为 mem
对 SR( DS/SS/ES)赋值
MOV AX,lmm
MOV SR,AX
对 CS不能用 MOV赋值
2,PUSH src; W,SP ← SP -2
(SP+1)(SP) ← src
POP dest; W,dest← (SP+1)(SP)
SP← SP+2
3,XCHG dest,src; B/W,dest ← src
src → dest
4,XLAT; B,
XLAT 变量名 /表格首地址 B,
AL← [ BX+AL ]
5,LEA reg16,mem ; W,reg ← EAsrc
( load effective address)
6,传送是复制 (COPY),除 XCHG。 XLAT外都不改变
src。
7,除 POPF,SAHF外,不影响 FR。
二、算术运算指令 (20条 )
助记符 功能加法指令
ADD 加法
ADC 带进位的加法
INC 增量(加 1)
AAA 加法的 ASCII修正
DAA 加法的十进制修正减法指令
SUB减法
SBB 带借位的减法
DEC 减量(减 1)
NEG 求补(变负)
CMP 比较
AAS 减法的 ASCII修正
DAS 减法的十进制修正乘法指令
MUL 无符号数乘法
IMUL 整数乘法
AAM 乘法的 ASCII修正除法指令
DIV 无符号数除法
IDIV 整数除法
AAD 除法的 ASCII修正
CBW 字节转换为字
CWD 字转换为双字
1,加法指令
ADD dest,src ; B/ W dest+src → dest
ADC dest,src ; B/ W dest+src+CF → dest
dest 和 src 可以是带符号数,也可以是无符号数。
INC dest ; B/ W dest ← dest + 1
INC 指令不影响 CF。
2,减法指令
SUB dest,src ; B/W dest-src → dest
SBB dest,src ; B/W dest-src-CF → dest
CMP dest,src ; B/W dest-src
DEC dest ; B/W dest –1 → dest
NEG dest ; B/W +1 → destdest
对 NEG的三种理解:
l) dest求补 (全部位取反加 l);
2) dest变负;
3) 零减 dest。
3,修正指令
DAA,DAS
当 BCD码进行加法或减法运算时,在加法指令和减法指令后,必须加上一条 DAA指令 (加法 )或 DAS(减法 )指令。
DAA和 DAS指令对 AL进行加 6修正。
4,乘除法指令(乘法)
MUL,DIV
MUL r/m; (B/W)
当 r/m为 8位时,指令操作为 AL × r/m 送 AX
当 r/m为 16位时,指令操作为 AX × r/m 送 DX_ AX
5,乘除法指令(除法)
DIV r/m; (B/W)
当 r/m为 8位时,指令操作为,AX/( r/m )B,结果商送 AL,
余数送 AH;
当 r/m为 l6位时,指令操作为,DX_AX/(r/m)w,结果商送 AX,
余数送 DX。
6,扩展指令
CBW; AL转换为 AX,且 AX=AL
CWD; AX转换为 DX AX,且 DX_AX=AX
都为符号扩展。
三、位处理指令 ( 12条 )
助记符 功能逻辑运算指令
AND 逻辑“与”
OR 逻辑“或”
NOT 逻辑“非”
XOR 逻辑“异或”
TEST 测试移位指令
SHL 逻辑左移
SAL 算术左移
SHR 逻辑右移
SAR 算术右移循环移位指令
ROL 循环左移
ROR 循环右移
RCL 通过 CF循环左移
RCR 通过 CF循环右移
1,逻辑运算指令
AND,OR,XOR,TEST,NOT
前三条指令执行后,同时使 CF=0
TEST 指令实现”与”操作,但不改变目的操作数,将运算结果的特性反映在标志寄存器中
NOT 指令不影响标志位。
2,移位指令
SHL / SAL,( 逻辑左移 /算术左移 ),实现相同操作;
功能:
0
(补零)
CF dest
SHR 逻辑右移
SAR 算术右移,实现带符号数被 2除,朝小取整。
( SH……shift,A……arithmetic )
0
dest CF
dest CF
3,循环移位指令
ROL 小循环左移
ROR 小循环右移
CF dest
dest CF
RCL 带进位位左移 (大循环左移 )
RCR 带进位位右移 (大循环右移 )
CF dest
dest CF
注意:移位和循环移位后移出位都送标志位 CF
指令格式:
SHL /ROR reg /mem,count
count = 1 ( 移位次数为 1时 )
count = CL ( 移位次数大于 1时 )
例如,AL逻辑右移 4次的指令为:
MOV CL,4
SHR AL,CL
四、串操作指令(共 8条)
助记符 功能串操作指令
MOV( MOVSB,MOVSW) 串传送(字节传送,字传送)
CMPS( CMPSB,CMPSW) 串比较(字节比较,字比较)
STOS( STOSB,STOSW) 存入串(存入字节,存入字)
LODS( LODSB,LODSW) 取出串(取出字节,取出字)
SCAS( SCASB,SCASW) 扫描串(扫描字节,扫描子)
重复前缀
REP 重复操作
REPE/REPZ 等于 /为零重复
REPNE/REPNZ 不等于 /不为零重复
1,MOVSB; [DS:SI]B → [ES:DI] B,SI/DI +/- 1
CMPSB; [DS:SI] B- [ES:DI]B,SI/DI+/-1
STOSB; AL → [ES,DI] B,DI+/-1
LODSB; [DS,SI]B → AL,SI+/-1
SCASB; AL- [ES;DI]B,DI+/-1
2,若 MOVSB改为 MOVSW,则改为字操作
[DS,SI]B 和 [ES,DI]B 改为 [DS,SI]W 和 [ES,DI]W
CMPSW同 MOVSW,
STOSW,LODSW和 SCASW指令中将原来的 AL
改为 AX
而 SI/DI +/-1 改为 SI/DI +/-2
3,若五条串操作指令中来标明 B或 W,则指令格式为:
MOVS dest,src
CMPS src,dest; src-dest
STOS dest
LODS src
SCAS dest
式中 dest和 src 都为变量名,
变量定义时所定义的类型属性决定串操作中的操作类型。
4,5条重复前缀指令例题:要求把内存区中 2000H,5000H开始的 100个字节 数传送到 3000H,4000H中,用串操作指令实现之。
注意,MOVSB指令每执行一次只能传送一个字节,所以必须编写一段循环程序,
MOV AX,2000H
MOV DS,AX
MOV AX,3000H
MOV ES,AX
MOV SI,5000H
MOV DI,4000H
MOV CX,100
LOP,MOVSB
DEC CX
JNZ LOP
若采用重复前缀 REP,则最后三条指令可改为:
REP MOVSB
REP的功能是:重复执行右边的串操作指令 CX次另有 4条重复前缀指令:
REPZ…… 若 CX≠0,且 ZF=1,则重复执行右边的串操作指令,每执行一次 CX-1
若 CX=0,或 ZF=0,则结束串操作
REPNZ…… 若 CX≠0,且 ZF=0,则重复执行右边的串操作指令,每执行一次 CX-1
若 CX=0,或 ZF=1,则结束串操作
REPE与 REPZ功能一样,REPNE与 REPNZ功能一样。
通常 REP前缀用于 MOVS/MOVSB/MOVSW
和 STOS/SORSB/STOSW而 REPZ/REPE/ REPNZ/
REPNE 前缓用于 CMPS/CMPSB/CMPSW 和
SCAS/SCASB/SCASW。
五、程序转移指令 (29条 )
助记符 功能无条件转移指令
CALL 调用过程(子过程)
RET 从过程(子程序)返回
JMP 无条件转移条件转移指令
JA/JNBE 高于 /不低于等于,转移
JAE/JNB 高于等于 /不低于,转移
JB/JNAE 低于 /不高于等于,转移
JBE/JNA 低于等于 /不高于,转移
JC 有进位(借位),转移
JE/JZ 等于 /为零,转移
JG/JNLE 大于 /不小于等于,转移
JGE/JNL 大于等于 /不小于,转移
JL/JNGE 小于 /不大于等于,转移
JLE/JNG 小于等于 /不大于,转移
JNC 无进位(借位),转移条件转移指令
JNE/JNZ 不等于 /不为零,转移
JNO 不溢出,转移
JNP/JPO PF为,0”/奇状态,转移
JNS SF为,0”,转移
JO 溢出,转移
JP/JPE PF为,1”/偶状态,转移
JS SF为,1”,转移
JCXZ 寄存器 CX = 0,转移重复控制指令
LOOP 循环
LOOPE/LOOPZ 等于 /为零,循环
LOOPNE/LOOPNZ 不等于 /不为零,循环中断指令
INT 中断
INT3 断点中断
INTO 溢出中断
IRET 中断返回
1,无条件跳转
( 1 ) JMP 标号 / reg / mem
① 标号 ( label ) 是代码段中一条指令的符号地址,
它可以作为程序转移指令的操作数使用。
标号有三属性 ……
段属性 (段基值 )
偏移量属性 (偏移地址 )
类型属性 (NEAR或 FAR)
标号的类型属性为 FAR,
则实现段间转移,指令为 5字节长;
标号的类型属性为 NEAR,
则实现段内转移,指令为 3字节长;
标号的类型属性为 NEAR中的 SHORT,
则实现段内短转移,指令为 2字节长。
段间跳转时机器指令中的地址为绝对地址,
是二个 16位地址,偏移地址在前,段基值在后;
段内跳转时机器指令中的地址为相对地址,
是偏移地址的差值 (16位 );
段内短跳转时机器指令中的地址为相对地址,
是偏移地址的差值 (8位 )。
② JMP BX ; NEAR,
功能为,IP BX
③ JMP [BX]
[BX] 必须写明:
是 WORD PTR [BX],还是 DWORD PTR [BX]
若为 WORD PTR [BX],
则为段内跳转,功能是用 [BX]W送 IP;
若为 DWORD PTR [BX],
则为段间跳转,功能是用 [BX]DW送 CS,IP。
JMP指令的汇编表示分类范围寻址方式 操作数类型操作数使用方式 示例段内转移直接 标号 1字节立即数 加入 IP JMP SHORT STARTJMP START2字节立即数 加入 IP
间接 寄存器操作数 送入 IP JMP BXJMP JTABLE[BX]存储器操作数( 2字节) 送入 IP
段间转移 直接 标号( 4字节立即数) 送入 IP/CS JMP START1间接 存储器操作数( 4字节) 送入 IP/CS JMP JTABLE1[BX]
( 2 ) CALL 标号 / reg / mem
调用指令,用来调用一个子程序 (过程 ),
又称为转子指令。
CALL指令的格式同 JMP指令,
区别在于 CALL指令必须保存断点 (CS,IP),
这是由硬件来实现的。
( 3 ) RET
返回指令,从子程序返回主程序。
2,条件转移指令
JC / JZ / JS /JO / JP
当 CF /ZF /SF/ OF /PF =1时跳转;
JNC /JNZ / JNS /JNO /JNP
当 CF /ZF /SF / OF /PF =0 时跳转
JP与 JPE 等价,JNP与 JPO 等价;
JZ与 JE等价,JNZ与 JNE等价。
JA above >
JB below <
JG greater >
JL less <
JA 和 JB 用于无符号数,JG和 JL用于带符号数。
JA与 JNBE等价
JCXZ 当 CX=0时跳转所有的条件转移指令都为短跳转,操作数为标号。
3,重复控制指令
LOOP 标号
CX-1→CX,当 CX≠ 0时跳到标号处。
LOOPZ / LOOPE 当 CX-1→ CX,CX≠ 0 且 ZF=1时跳转
LOOPNZ /LOOPNE 当 CX-1→ CX,CX ≠ 0 且 ZF=0时跳转
LOOP 标号 与 DEC CX
JNZ 标号 等价。
4,中断指令
INT N ;指令中断,N为 0~255间的正整数
INT3 ;断点中断,单字节中断指令
INTO ;溢出中断,当 OF=1时中断
IRET ;中断返回六、处理器控制指令 (12条 )
助记符 功能标志操作
STC 进位标志置 1
CLC 进位标志置 0
CMC 进位标志取反
STD 方向标志置 1
CLD 方向标志置 0
STI 中断允许标志置 1
CLI 中断允许标志置 0
外同步
HLT 暂停直至中断或复位
WAIT 等待 信号有效
ESC 交权给外部处理机
LOCK 在下一条指令期间封锁总线空操作 NOP 空操作
TEST
六条对标志位置 l和清 0的指令:
STI STD STC CLI CLD CLC
CF 取反指令 CMC
空操作指令 NOP
暂停指令 HLT
以及其它三条控制 CPU工作的指令:
WAIT (等待 ),ESC (交权 ),LOCK (封锁指令 )。
3.2.2 80386以上微处理系统的指令系统一、实地址方式下的 32位微处理器的指令系统
1,提供 32位寄存器,
支持 32位寻址,可使用 32位偏移量。
2,扩大了原有指令的工作范围。
FS,GS,SS、指令二,32位微处理器扩充指令如 INS dest,DX
OUTS DX,src
三、高级指令和保护控制指令高级指令 BOUND,ENTER,LEAVE
保护控制指令:
非保护方式的指令如 LMSW/SMSW等; LGDT/SGDT等;
保护方式的指令如 LLDT/SLDT等四,80386新增加的指令位操作指令条件设置指令五,80486新增加的指令:
包括 80387全部指令,
并增加了 6条新指令:
BSWAP 字节交换
CMPXCHG 比较交换
XADD 交换加
INVD 清除 Cache
WBINYP 回写和使 Cache无效
INVLPG 清除 TLB入口六,Pentiums新增加的指令
CMPXCHG8B 比较和交换 8bytes
CPUID CPU标识码
RDTSC 读时间戳计数器
RDMSR 读模型专用寄存器
WRMSR 写模型专用寄存器
RSM 从系统管理方式返回
MOV CR4,reg32 写 CR
MOV reg32,CR4 读 CR
MOV DR4/DR5,reg32 写 DR
MOV reg32,DR4/DR5 读 DR