汇编语言程序设计_第3章 80x86指令系统
合集下载
第3章 80x86 指令系统和寻址方式

MOV EAX,12345678H EAX,
需要注意的问题: 需要注意的问题:
需要注意的问 题!!
操作数直接出现在指令中, 1)操作数直接出现在指令中,但不能作为目的操作数出现在指令 这与高级语言中, 中 , 这与高级语言中, 赋值语句的左边不能是常量的要求是相 同的。 同的。 立即数可以写成:10进制(D) 进制( 进制(D 进制( 16进 2 )立即数可以写成 : 10 进制 (D) ,2 进制 (B ) ,8 进制( O ) ,16进 制(H)。 要注意立即数的表示范围: 3)要注意立即数的表示范围: 位带符号数表示范围: 127( FH) 128(80H 8位带符号数表示范围: 127(7FH)~ -128(80H) 16位带符号数表示范围 32767( FFFH) 位带符号数表示范围: 32768(8000H 16位带符号数表示范围:32767(7FFFH)~ -32768(8000H) 位无符号数表示范围: 255(OFFH) 8位无符号数表示范围: 0 ~ 255(OFFH) 16无符号数位表示范围 无符号数位表示范围: 65535( FFFFH) 16无符号数位表示范围:0 ~65535(0FFFFH) 16位带符号数表示范围 32767( FFFH) 位带符号数表示范围: 32768(8000H 16位带符号数表示范围:32767(7FFFH)~ -32768(8000H)
【例3பைடு நூலகம்3】判断下列指令的寻址方式: 判断下列指令的寻址方式:
EAX, MOV EAX,EBX ;源操作数和目的操作数均为寄存器寻址 MOV ADD AX,1234H;目的操作数为寄存器寻址, AX,1234H;目的操作数为寄存器寻址,源操作数是立即数寻址 X, X, AX ;源操作数为寄存器寻址,目的操作数为存储器寻址 源操作数为寄存器寻址, ;将DS的内容压栈指令,源操作数为寄存器寻址 DS的内容压栈指令, 的内容压栈指令 ;将标志寄存器的内容压栈指令,源操作数是寄存器寻址 将标志寄存器的内容压栈指令, ;置标志寄存器DF=1, 目的操作数是寄存器寻址 置标志寄存器DF=1, DF=1
第3章 80X86指令系统

程序是使计算机完成一个任务的一组命令或指令序 列。 指令是规定微处理器执行某种特定操作的“命令”。 指令系统是计算机全部的指令的集合。 机器指令由二进制数组成,计算机硬件只能识别﹑ 存储和运行机器指令。机器指令无论是在书写、阅 读和记忆都是非常困难的,为此,产生了符号化的 机器指令,即符号指令。
格式:段寄存器:[间址寄存器] 操作数的有效地址存在于基址或变址寄存器中。 16位寻址时, EA由BX,SI,DI或BP提供。 其中,BX,SI,DI默认使用DS,BP默认使用SS。 32位寻址时, EA由 EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP。 其中,ESP,EBP默认使用SS, 其余默认使用DS
基址寄存器和变址寄存器须为规定的32位寄存器.
小结:
实模式时,段的最大长度为64KB,所以必须保 证CPU最终算出的有效地址不超过0FFFFH,而且 操作数最高字节单元的有效地址也不能超过 0FFFFH,否则执行寻址时系统将要瘫痪。 有效地址表达式中的位移量是无符号整数。 带有比例因子的变址寻址常用于检索一维数组元 素,比例因子的大小常由数组元素大小决定。 带有比例因子的基址加变址寻址常用于检索二维 数组元素。 存储器寻址方式中使用的寄存器和默认访问的逻 辑段间的对应关系如表3-5所示。
表3-4 16/32位寻址时有效地址4种成分的组成
十六位寻址 位移量 基址寄存器 变址寄存器 0,8,16 BX,BP SI,DI 三十二位寻址 0,8,32 任何32位的 通用寄存器 除ESP以外的 32位通用寄 存器 1,2,4,8
比例因子
无
1.
直接寻址方式
直接寻址方式有两种格式。在第一种格式中,有效 地址EA直接出现在指令中,存放在代码段中指令操 作码之后,操作数存放在数据段中,这钟格式中段 超越前缀不能省略,否则会出现寻址错误。在另一 种格式中,EA是用变量来代表的存储单元的有效地 址。因为在一般情况下,直接给出操作数所在单元 的直接地址是很困难的,因此在直接寻址方式的使 用上,第二种格式(用变量来代表操作数的直接地 址)更为常见。
第三章 80X86指令系统和寻址方式

7.相对基址变址寻址方式:
有效地址是基址寄存器(BX/BP)、变址寄存 器(SI/DI)与一个8位或16位位移量之和:
EA=BX/BP+SI/DI+8/16位位移量
该方式中,BX/BP选一,SI/DI选一 段地址对应BX基址寄存器默认是DS,对应BP 基址寄存器默认是SS;可用段超越前缀改变
基址寻址:偏移地址是指令中给定的偏移量和寄存器
BX或基数指针BP的内容之和;BX作为基址寄存器时且无 段超越时,物理地址由DS和偏移地址形成;BP作为基址 寄存器时且无段超越时,物理地址由SS和偏移地址形成。
例如:MOV BX,DELTA[BP]
变址寻址:操作数的偏移地址为指令中给定的8位或16
直接寻址的功能
MOV AX,DS:[2000H]
直接寻址的执行
MOV AX,DS:[2000H]
例:MOV AX, [ 2000H ] EA=2000H, 假设(DS)=3000H, 那么PA=32000H
AH
AL
30
50
32000
50 30 (AX)= 3050 H
例如: MOV AX, DATA 或 MOV AX, [DATA] 这里DATA是存放操作数单元的符号地址。
寄存器间接寻址的功能
寄存器间接寻址的执行
例:
MOV AX, [BX] PA = 16d × (DS) + (BX) MOV AX, ES:[BX] PA = 16d × (ES) + (BX) MOV AX, [BP] PA = 16d × (SS) + (BP) * 不允许使用AX、CX、DX 存放 EA
即: 若用寄存器SI,DI,BX间接寻址,则操作数在当前数据段中。 PA=(DS)×10H+EA 若用寄存器BP间接寻址,则操作数在当前堆栈段中。 PA=(SS)×10H+EA
第3章-X86指令系统

POP REG POP SREG POP MEM
将栈顶的数据送入一个寄存器中 将栈顶的数据送入一个段寄存器中 将栈顶的数据送入内存单元
两个操作都是以字为单位进行的
34
栈指令
PUSH AX的执行过程 (1)(SP)= (SP)2,SS:SP指 向当前栈顶前面的单元,以当 前栈顶上面的单元为新的栈顶; (2)将AX中的内容送入SS:SP 指向的内存单元处,此时SS:SP 指向新栈顶。
[DI+idata]/idata[DI] [BP+idata]/idata[BP]
EA=(BX)+idata,SA=(DS) EA=(SI)+idata,SA=(DS)
EA=(DI)+idata,SA=(DS) EA=(BP)+idata,SA=(SS)
16
寄存器相对寻址
MOV AL, [BX+5]
含义 EA=(BX)+(SI),SA=(DS) EA=(BX)+(DI),SA=(DS) EA=(BP)+(SI),SA=(SS) EA=(BP)+(DI),SA=(SS)
18
基址加变址寻址
MOV AX, [BX+SI]
19
相对基址变址寻址
操作数在存储器中 偏移地址:(基址寄存器)+(变址寄存器)+相对偏移量
NUIST
第3章 80X86微处理器指令系统
主要内容
寻址方式 8086/8088指令系统 32位处理器指令系统
2
NUIST
3.1 寻址方式
处理的数据在什么地方 ? 要处理的数据有多长 ? 隐含于 机器指令内 …… 操作数
指令的一般格式: 操作码 操作数
第3章80x86的寻址方式与指令系统(自学)

有效地址的计算公式:
EA=基址+(变址×比例因子)+位移量
2020/8/1
汇编语言程序设计
16
3.2 80x86的寻址方式
16/32位寻址时EA四种成分的组成
位移量
0,8,16位 0,8,16,32位
基址寄存器 BX,BP 任何32位通用寄存器
变址寄存器 SI,DI 32位通用寄存器(除ESP)
比例因子
指令的形式有: 双操作数指令 单操作数指令 隐含操作数指令
DEC CX AAA
2020/8/1
汇编语言程序设计
5
3.1 指令系统概述
3. 操作数的种类
(1) 立即数——操作数本身,存放在指令 代码中。 (2) 寄存器操作数——操作数存放在CPU 内部寄存器中。 (3) 内存操作数——操作数存放在内存中, 一般在数据段、附加段、甚至堆栈段。给 出的是操作数的地址。 (4) 端口操作数——在I/O指令中,给出的 端口地址。如
无 1,2,4,8
16位寻址 32位寻址
2020/8/1
汇编语言程序设计
17
3.2 80x86的寻址方式
段 约 定 和 段
在指令中大多隐含 段地址。段地址有个基 本的规定(约定,默 认),也允许超越(可
超 修改),见下表所示:
越
2020/8/1
汇编语言程序设计
18
3.2 80x86的寻址方式
2020/8/1
汇编语言程序设计
11
3.2 80x86的寻址方式
2.寄存器寻址方式(Register addressing) 操作数在寄存器中,指令指定寄存器号。
对于16位操作数,寄存器可以是AX、BX、 CX、DX、SI、DI、SP、BP;对于8位操作数,寄 存器可以是AH、AL、BH、BL、CH、CL、DH、 DL。对于32位操作数,寄存器可以是EAX、EBX、 ECX、EDX、ESI、EDI、ESP、EBP;
80x86汇编语言程序设计 第3章 80x86指令系统和寻址方式PPT课件

合肥学院 计算机科学与技术系 何立新
《汇编语言程序设计》
3.2 80x86寻址方式
3.2.1 寻址、寻址方式的概念
寻址就是寻找操作数的地址。 寻址方式就是寻找操作数的方法。
操作数可以跟随在指令操作码之后,称为立即数;操作 数也可以存放在CPU内部的寄存器中,称为寄存器操作数。 绝大多数的操作数存放在内存储器中,称为存储器操作数。 指令指定操作数的位置,即给出地址信息,在执行时需要 根据这个地址信息找到需要的操作数。
合肥学院 计算机科学与技术系 何立新
《汇编语言程序设计》
第3章 80x86指令系统和寻址方式
教学要求:
1. 掌握一般指令系统的基本概念:指令格式、 功能和注意事项。
2. 重点掌握8086/8088指令系统中,各指令的 格式、寻址方式、指令类型 。
3. 了解其他(奔腾等)的寻址方式和指令类型。
合肥学院 计算机科学与技术系 何立新
•基址变址寻址
MOV AX , [ BP ] [ DI ]
•相对基址变址寻址 MOV AX , MASK [ BX ] [ SI ]
合肥学院 计算机科学与技术系 何立新
《汇编语言程序设计》
1) 立即寻址方式
定义:操作数作为指令的一部分而直接写在指令中,这种 操作数称为立即数,这种寻址方式也就称为立即数寻址方 式。
执行:4576H→AX
执行后:(AX)=4576H
CS→
AX
45
76
OP
76H
45H
MOV AX,4576H 指令的存储形式
合肥学院 计算机科学与技术系 何立新
《汇编语言程序设计》
2) 寄存器寻址方式
定义:指令所要的操作数已存储在某寄存器中,或把目标操 作数存入寄存器。把在指令中指出所使用寄存器(即:寄存 器的助记符)的寻址方式称为寄存器寻址方式。
第三章 汇编语言80X86的指令系统和寻址方式

第3章 80x86指令系统和寻址方式
《汇编语言》
对同一类型指令,执行速度: 寄存器操作数 立即数操作数 存储器操作数
快
慢
例
mov mov mov
AL , BL AL , 0 AL , [ BX ]
快
慢
17
第3章 80x86指令系统和寻址方式
《汇编语言》
3.2
80x86寻址方式
3.2.1 寻址、寻址方式的概念
18
第3章 80x86指令系统和寻址方式
《汇编语言》
3.2.2 80X86的指令格式
指令助记符 [ 操作数1 [ , 操作数2 [ , 操作数3 ] ] ] [;注释]
指令助记符体现该指令的功能,它对应一条二进 制编码的机器指令。 指令的操作数个数由该指令确定,可以没有操作 数,也可以有一个、二个或三个操作数。
指令系统的基本概念
指令系统
计算机的指令系统就是指该计算机能够执行
的全部指令的集合。 每种计算机都有它支持的指
令集合。 16位8086指令系统是整个Intel 80x86 系列微处 理器指令系统的基础。
2
第3章 80x86指令系统和寻址方式
《汇编语言》
3.1.2
指令格式
指令由操作码和操作数两部分组成。
双操作数: 指令中给出两个操作数。
7
第3章 80x86指令系统和寻址方式
《汇编语言》
① 无操作数: 指令只有一个操作码,没有操作数。
有两种可能: ▲ 有些操作不需要操作数。 如 HLT,NOP等处理机控制指令。 ▲ 操作数隐含在指令中。 如 STC , CLC等处理机控制命令。
AAA , DAA等调整指令。
1) 立即寻址方式
汇编语言程序设计-80X86指令系统和寻址方式

1.数据传送类指令 • 数据传送类指令用于实现CPU的内部寄存器之间 • CPU内部寄存器和存储器之间 • CPU累加器AX或AL和I/O端口之间的数据传送 此类指令除了SAHF和POPF指令外均不影响标志寄存器的
内容。 在数据传送指令中,源操作数和目的操作数的数据长度
必须一致。
(1)MOV指令
指令功能:把AX中的16位数或AL中的8位数输出到指定端口。
例 3.26
OUT 22H, AL
(4)段间间接寻址方式 这种寻址方式是由指令中给出的存储器数据寻址方式,包括存
放转移地址的偏移量和段地址。其低位字地址单元存放的 是偏移地址,高位字地址单元中存放的是转移段基值。这 样既更新了IP内容又更新了CS的内容,故称为段间间接寻 址。 例 JMP WORD PTR[BX] ;转移到当前代码位置内 ;有效地址存放在BX寻址的单元中
;物理地址=DS×16+SI
MOV [DI], DX
;物理地址=DS×16+DI
2) 以BP进行寄存器间接寻址(BP作为地址指针)的方式
隐含的段寄存器为堆栈段寄存器SS,操作数存放在堆栈段区域, 将堆栈段寄存器SS的内容左移4位,再加上基址寄存器BP的 内容,即为操作数的物理地址。
例
MOV [BP], BX
OP
DW
OP
SW
操作码格式
8086指令格式
几点说明: ① 一条指令可以包含一个操作数,也可以包含一个以上的操作
数;一个操作数的指令称为单操作数指令,单操作数指令中 的操作数可能由指令本身提供,也可能由指令隐含地指出。 ② 若位移量或立即数为16位,那么在指令代码中,将低位字节 放在前面,高位字节放在后面。 ③ 8086指令系统中大多数指令的操作码只占用第一个字节,但 有几条指令是特殊的,其指令中的第一个字节不但包含操作 码成分,而且还隐含地指出了寄存器名,从而整个指令只占 一个字节,成为单字节指令。这些指令字节数最少,执行速 度最快,用得也最频繁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.3.2 算术指令
1. 加法
一般形式:
ADD dest, src ; dest = dest + src
ADC dest, src ; dest = dest + src + CF
INC
dest
; dest = dest + 1
语法格式:
ADD reg/mem, reg/mem/imm
ADC reg/mem, reg/mem/imm
movsx ax, al ; 等价于cbw movsx eax, ax ; 等价于cwde movsx eax, al ; 等价于顺序执行cbw与cwde
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(3)MOVZX 一般形式: MOVZX dest, src ; src零扩展为dest;386新增 语法格式: MOVZX reg16, reg8/mem8 MOVZX reg32, reg8/mem8/reg16/mem16
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
5. 堆栈操作指令
80x86系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单
元。 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地
INC
reg/mem
对标志位的影响:
ADD、ADC:按一般规则影响CF、OF、SF和ZF。 INC:不影响CF,其它同ADD。 说明:ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数。
2019/8/26
80x86汇编语言程序设计
3.3.2 算术指令
2. 减法
一般形式:
SUB
dest, src ; dest = dest – src
pop
ax
; ax = 5678h, sp = 0feh
pop
ax
; ax = 1234h, sp = 100h
【例】交换AX与CX的值。
push
ax
push
cx
pop
ax
pop
cx
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
6. 标志寄存器传送指令
(1)LAHF(Load AH from Flags) 语法格式: LAHF ; AH = FLAGS的低8位 对标志位的影响:无。
【例】设SP = 100H, EBX = 12345678H, 给出下列指令依次执行后的结果。
push bx
; ss:[00ffh] = 56h, ss:[00feh] = 78h, sp = 0feh
pop
ax
; ax = 5678h, sp = 100h
push
ebx
; ss:[00feh] = 1234h, ss:[00fch] = 5678h, sp = 0fch
对标志位的影响:无。 说明:
oprd1与oprd2不能作如下搭配: XCHG mem, mem
oprd1与oprd2类型必须匹配。、 【例】
xchg ebx, edx xchg [ebp][eax*4], edx
; 交换oprd1与oprd2的内容 ; 错误
2019/8/26
80x86汇编语言程序设计
PUSH
imm
功能描述:
PUSH指令(16位):
SP = SP - 2 SS:[SP] = 16位操作数 POP指令(16位): 16位操作数 = SS:[SP]
SP = SP + 2 PUSH指令(32位):
SP = SP - 4 SS:[SP] = 32位操作数 POP指令(32位): 32位操作数 = SS:[SP]
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
8. XLAT(Translate):换码
语法格式: XLAT ; AL = DS:[ BX +AL ]
功能描述:将DS:BX所指内存区中、由AL指定位移处的一个字节赋给AL。 对标志位的影响:无。
2019/8/26
80x86汇编语言程序设计
SP = SP + 4 对标志位的影响:无。
; 操作数不能是CS ; 286新增
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(2)PUSHF与POPF:标志寄存器进栈和出栈 语法格式:
PUSHF
; FLAGS进栈
POPF
; 栈顶字出栈到FLAGS
对标志位的影响:只有POPF指令会以弹出值设置标志寄存器。
; 错误
dest不能是CS。
dest与src必须类型匹配,即同时是字节、字或双字类型。
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
2. XCHG ( Exchange ):交换
一般形式: XCHG oprd1, oprd2
语法格式: XCHG reg/mem, reg/mem
reg16 — 16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SP
reg32 — 32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP
reg
— reg8/reg16/reg32
seg
— 段寄存器CS/DS/SS/ES/FS/GS
mem8 — 8位内存操作数
mem16 — 16位内存操作数
lea
si, 2[eax][edx]
; 执行后,SI = 5
4. LDS、LES
语法格式:
LDS reg16, mem32
; reg16 = mem32的低字,DS = mem32的高字
LES
reg16, mem32
; reg16 = mem32的低字,ES = mem32的高字
对标志位的影响:无。
cwde ; eax = 0fffffffeh(-2)
cdq
; edx = 0ffffffffh, eax不变,即edx:eax = -2
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(2)MOVSX 一般形式: MOVSX dest, src 语法格式:
; src符号扩展为dest;386新增
mem32 — 32位内存操作数
— mem8/mem16/mem32 — 64位内存操作数 — 8位立即数 — 16位立即数 — 32位立即数 — imm8/imm16/imm32
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
1. MOV ( Move ):传送
一般形式:
MOV 语法格式:
址方向移动,而POP操作则刚好相反。 堆栈操作只能以字或双字为单位。 SS:SP指向栈顶。
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(1)PUSH与POP:进栈与出栈 g/mem16/ reg32/mem32
POP
reg16/seg/mem16/ reg32/mem32
dest, src ; dest = src。将源操作数src复制到目的操作数dest,src不变。
MOV reg/mem/seg, reg/mem/seg/imm 对标志位的影响:无。
说明:
dest与src不能作如下搭配:
MOV mem, mem
; 错误
MOV seg, seg
; 错误
MOV seg, imm
(2)SAHF(Store AH into Flags) 语法格式: SAHF ; FLAGS的低8位 = AH 对标志位的影响:由新装入值确定。
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
7. 符号扩展与零扩展指令
对标志位的影响:无。
(1)CBW、CWD、CWDE与CDQ
1.立即数: 8位或16位立即数。 2.寄存器操作数:
8 位 /16 位 通 用 寄 存 器 和 段 寄 存 器 (除了FS和GS)。
3.内存操作数
包括下列几种形式。 Variable 或 [Variable] [reg] disp[reg] [base][index] disp[base][index]
第3章 80x86指令系统
讲授要点
3种操作数(立即数、寄存器和内存操作数)的形式。 常用指令的格式、功能以及对CF、OF、SF、ZF的影响。 使用指令时容易犯的错误。
2019/8/26
80x86汇编语言程序设计
3.1 指令格式
1.指令的书写格式
标号: 指令助记符
操作数
; 注释
2.操作数的3种形式:
立即操作数:指令的操作数是立即数,并直接出现在指令中。 寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。 内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄 存器中。
2019/8/26
80x86汇编语言程序设计
3.2 操作数的形式 3.2.1 8086指令的操作数形式
包括下列几种形式。 [base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]
说明:
base、index为任一32位通用寄 存器(index不能取ESP)。