汇编语言程序设计_第3章 80x86指令系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例】设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
包括下列几种形式。 [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)。
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位内存操作数
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]
MOVSX reg16, reg8/mem8
MOVSX reg32, reg8/mem8/reg16/mem16 功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用来将8位数符号扩展为16位或
32位数,或者将16位数符号扩展为32位数。 【例】 CBW和CWDE的功能可由MOVSX指令实现。
语法格式:
CBW ; AL符号扩展为AX
CWD ; AX符号扩展为32位数DX:AX
CWDE ; AX符号扩展为EAX;386新增
CDQ ; EAX符号扩展为64位数EDX:EAX;386新增
【例】设AL = 0FEH,给出依次执行下列指令后的结果。
cbw
; ax = 0fffeh
cwd
; dx = 0ffffh, ax不变,即dx:ax = -2
第3章 80x86指令系统
讲授要点
3种操作数(立即数、寄存器和内存操作数)的形式。 常用指令的格式、功能以及对CF、OF、SF、ZF的影响。 使用指令时容易犯的错误。
2019/8/26
80x86汇编语言程序设计
3.1 指令格式
1.指令的书写格式
标号: 指令助记符
操作数
; 注释
2.操作数的3种形式:
若使用了BP,则隐含段地址在SS,否则在DS。 当段地址不在隐含的段寄存器时,可使用段超越 前缀,形式为:
段寄存器名:
2019/8/26
80x86汇编语言程序设计
3.2.2 32位CPU扩展的操作数形式
1.立即数: 32位立即数。 2.寄存器操作数: 32位通用寄存器以及FS和GS。 3.内存操作数
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
5. 堆栈操作指令
80x86系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单
元。 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地
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新增
说明:
Variable是变量名或变量名 ± 整数表达式。 reg为BX、BP、SI、DI。 disp可以是常量或变量,汇编后为一个常数,若 是变量,则取其偏移地址。
base为BX或BP,index为SI或DI。 有效地址为各项之和。如disp[base][index]形 式,EA = base + index + disp。
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
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
SBB CMP
dest, src ; dest = dest - src – CF dest, src ; dest – src。 与SUB的区别在于,不将减法结果存入dest。
DEC dest
; dest = dest - 1
NEG dest 语法格式:
; dest = 0 – dest
SUB
reg/mem, reg/mem/imm
SP = SP + 4 对标志位的影响:无。
; 操作数不能是CS ; 286新增
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(2)PUSHF与POPF:标志寄存器进栈和出栈 语法格式:
PUSHF
; FLAGS进栈
POPF
; 栈顶字出栈到FLAGS
对标志位的影响:只有POPF指令会以弹出值设置标志寄存器。
立即操作数:指令的操作数是立即数,并直接出现在指令中。 寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。 内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄 存器中。
2019/8/26
80x86汇编语言程序设计
3.2 操作数的形式 3.2.1 8086指令的操作数形式
lea
si, 2[eax][edx]
; 执行后,SI = 5
4. LDS、LES
语法格式:
LDS reg16, mem32
; reg16 = mem32的低字,DS = mem32的高字
LES
reg16, mem32
; reg16 = mem32的低字,ES = mem32的高字
对标志位的影响:无。
址方向移动,而POP操作则刚好相反。 堆栈操作只能以字或双字为单位。 SS:SP指向栈顶。
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(1)PUSH与POP:进栈与出栈 语法格式:
PUSH
reg16/seg/mem16/ reg32/mem32
POP
reg16/seg/mem16/ reg32/mem32
mem32 — 32位内存操作数
— mem8/mem16/mem32 — 64位内存操作数 — 8位立即数 — 16位立即数 — 32位立即数 — imm8/imm16/imm32
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
1. MOV ( Move ):传送
一般形式:
MOV 语法格式:
; 错误
dest不能是CS。
dest与src必须类型匹配,即同时是字节、字或双字类型。
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
2. XCHG ( Exchange ):交换
一般形式: XCHG oprd1, oprd2
语法格式: XCHG reg/mem, reg/mem
1.立即数: 8位或16位立即数。 2.寄存器操作数:
8 位 /16 位 通 用 寄 存 器 和 段 寄 存 器 (除了FS和GS)。
3.内存操作数
包括下列几种形式。 Variable 或 [Variable] [reg] disp[reg] [base][index] disp[base][index]
2019/8/26
80x86汇编语言程序设计
为了描述方便,采用下列符号约定:
dest
— 目的操作数
src
— 源操作数
oprdn — 第n个操作数,如oprd1, oprd2, oprd3
=
— 赋值
/
— 或者
reg8
— 8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL
mem mem64 imm8 imm16 imm32 imm
对标志位的影响:无。 说明:
oprd1与oprd2不能作如下搭配: XCHG mem, mem
oprd1与oprd2类型必须匹配。、 【例】
xchg ebx, edx xchg [ebp][eax*4], edx
; 交换oprd1与oprd2的内容 ; 错误
2019/8/26
80x86汇编语言程序设计
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位 对标志位的影响:无。
3.3.1 数据传送指令
3. LEA (Load Effective Address ) :装入有效地址
语法格式:
LEA reg16, mem
; reg16 = mem的有效地址
对标志位的影响:无。
【例】设BX = 5678H,EAX = 1,EDX = 2。
lea
si, 2[bx]
; 执行后,SI = 567AH
(2)SAHF(Store AH into Flags) 语法格式: SAHF ; FLAGS的低8位 = AH 对标志位的影响:由新装入值确定。
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
7. 符号扩展与零扩展指令
对标志位的影响:无。
(1)CBW、CWD、CWDE与ห้องสมุดไป่ตู้DQ
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 数据传送指令
8. XLAT(Translate):换码
语法格式: XLAT ; AL = DS:[ BX +AL ]
功能描述:将DS:BX所指内存区中、由AL指定位移处的一个字节赋给AL。 对标志位的影响:无。
2019/8/26
80x86汇编语言程序设计
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
n为比例因子,取1、2、4或8。
若包含base且base为EBP或ESP, 则隐含段地址在SS;否则,隐含 段地址在DS。
若在16位CPU上编程,则不能使 用这些寻址方式。
2019/8/26
80x86汇编语言程序设计
3.3 指令系统
介绍设计完整程序所需的常用指令,对于其余指令,一部分在后续章节中讲授,一部分自 学。 介绍常用指令的格式、功能以及对CF、OF、SF、ZF的影响。