汇编语言程序设计_第3章 80x86指令系统

合集下载

第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指令系统

第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指令系统和寻址方式

第三章  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指令系统

第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的寻址方式与指令系统(自学)

第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课件

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的指令系统和寻址方式

第三章 汇编语言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指令系统和寻址方式

汇编语言程序设计-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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)。
相关文档
最新文档