第3章80X86指令系统 讲授要点 3种操作数(立即数、寄存器和内存操作数)的形式。 常用指令的格式、功能以及对CF、OF、SF、ZF的影响。 使用指令时容易犯的错误。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 第3章 80x86指令系统 讲授要点 ▪ 3种操作数(立即数、寄存器和内存操作数)的形式。 ▪ 常用指令的格式、功能以及对CF、OF、SF、ZF的影响。 ▪ 使用指令时容易犯的错误
3.1指令格式 1.指令的书写格式 标号:指令助记符 操作数 ;注释 2.操作数的3种形式: 立即操作数:指令的操作数是立即数,并直接出现在指令中。 寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。 ■内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄 存器中。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.1 指令格式 1.指令的书写格式 标号: 指令助记符 操作数 ; 注释 2.操作数的3种形式: ▪ 立即操作数:指令的操作数是立即数,并直接出现在指令中。 ▪ 寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。 ▪ 内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄 存器中
3.2操作数的形式 3.2.18086指令的操作数形式 1.立即数:8位或16位立即数。 说明 2.寄存器操作数: Variable是变量名或变量名±整数表达式 8位/16位通用寄存器和段寄存器reg为BX、BP、SI、D (除了FS和GS)。 "disp可以是常量或变量,汇编后为一个常数,若 3.内存操作数 是变量,则取其偏移地址。 包括下列几种形式。 a base为BX或BP, index为SDI Variable或[ Variable] 有效地址为各项之和。如 disp[base][index形式 [reg] EA=base+ index+disp。 disp[reg 若使用了BP,则隐含段地址在SS,否则在DS。 [baseline ■当段地址不在隐含的段寄存器时,可使用段超越 前缀,形式为 disp[base][index] 段寄存器名 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.2 操作数的形式 3.2.1 8086指令的操作数形式 1.立即数: 8位或16位立即数。 2.寄存器操作数: 8位/16位通用寄存器和段寄存器 (除了FS和GS)。 3.内存操作数 包括下列几种形式。 Variable 或 [Variable] [reg] disp[reg] [base][index] disp[base][index] 说明: ▪ Variable是变量名或变量名 ± 整数表达式。 ▪ reg为BX、BP、SI、DI。 ▪ disp可以是常量或变量,汇编后为一个常数,若 是变量,则取其偏移地址。 ▪ base为BX或BP,index为SI或DI。 ▪ 有效地址为各项之和。如disp[base][index]形式, EA = base + index + disp。 ▪ 若使用了BP,则隐含段地址在SS,否则在DS。 ▪ 当段地址不在隐含的段寄存器时,可使用段超越 前缀,形式为: 段寄存器名:
3.2.232位CPU扩展的操作数形式 1.立即数:32位立即数 2寄存器操作数:32位通用寄存器以及F和GS。说明: 3.内存操作数 base、 index为任-32位通用 寄存器( index不能取ESP)。 包括下列几种形式。 n为比例因子,取1、2、4或8 [base] 若包含base且base为EBP或 disp[base ESP,则隐含段地址在SS;否则, [basel[index] 隐含段地址在DS。 disp[base][index] 若在16位CPU上编程,则不能 使用这些寻址方式 [index*n] lisp[index*n Tbaselindex*n disp[base][index*n 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.2.2 32位CPU扩展的操作数形式 1.立即数: 32位立即数。 2.寄存器操作数: 32位通用寄存器以及FS和GS。 3.内存操作数 包括下列几种形式。 [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)。 ▪ n为比例因子,取1、2、4或8。 ▪ 若包含 base 且 base 为 EBP 或 ESP,则隐含段地址在SS;否则, 隐含段地址在DS。 ▪ 若在16位CPU上编程,则不能 使用这些寻址方式
3.3指令系统 介绍设计完整程序所需的常用指令,对于其余指令,一部分在后续章节中讲授,一部分自 学。 介绍常用指令的格式、功能以及对CF、OF、SF、ZF的影响。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.3 指令系统 ▪ 介绍设计完整程序所需的常用指令,对于其余指令,一部分在后续章节中讲授,一部分自 学。 ▪ 介绍常用指令的格式、功能以及对CF、OF、SF、ZF的影响
为了描述方便,采用下列符号约定 dest 目的操作数 mem mem8/mem16/mem 32 src 源操作数 mem64—64位内存操作数 第n个操作数,如 lordi,oprd2,oprd3 imm 8 8位立即数 赋值 imm1616位立即数 或者 imm32 32位立即数 8位通用寄存器 AH/AL/BHBL/CH//DL imm imm8/imm16/imm 32 regl 16位通用寄存器 AX/BX/CX/DX/SI/DI/BP/SP reg32 32位通用寄存器 EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP reg/regl 6/reg32 段寄存器 CS/DS/SS/ES/FS/GS mem 8 8位内存操作数 mem16 16位内存操作数 mem 32 32位内存操作数 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 ▪为了描述方便,采用下列符号约定: dest — 目的操作数 src — 源操作数 oprdn — 第n个操作数,如oprd1, oprd2, oprd3 = — 赋值 / — 或者 reg8 — 8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL 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位内存操作数 mem32 — 32位内存操作数 mem — mem8/mem16/mem32 mem64 — 64位内存操作数 imm8 — 8位立即数 imm16 — 16位立即数 imm32 — 32位立即数 imm — imm8/imm16/imm32
3.3.1数据传送指令 1.MoⅤ(Move):传送 一般飛式 MOv 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 错误 des不能是CS。 dest与src必须类型匹配,即同时是字节、字或双字类型。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.3.1 数据传送指令 1. MOV ( Move ):传送 一般形式: MOV 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 ; 错误 ▪ dest不能是CS。 ▪ dest与src必须类型匹配,即同时是字节、字或双字类型
3.3.1数据传送指令 2XCHG( Exchange):交换 一般形式 XCHG oprdl, oprd2 交换opd与oprd的内容 语法格式: XCHG reg/mem. reg/mem 对标志位的影响:无。 说明 " oprdl与oprd2不能作如下搭配 XCHG mem. mem 错误 " opal与oprd类型必须匹配。、 【例】 xchg ebx, edx [ebpjleax*4], edx 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.3.1 数据传送指令 2. XCHG ( Exchange ):交换 一般形式: XCHG oprd1, oprd2 ; 交换oprd1与oprd2的内容 语法格式: XCHG reg/mem, reg/mem 对标志位的影响:无。 说明: ▪oprd1与oprd2不能作如下搭配: XCHG mem, mem ; 错误 ▪oprd1与oprd2类型必须匹配。、 【例】 xchg ebx, edx xchg [ebp][eax*4], edx
3.3.1数据传送指令 3.LEA( Load Effective Address):装入有效地址 语法格式 LEA reg16 mem regl6=mem的有效地址 对标志位的影响:无。 【例】设BX=5678H,EAX=1,EDX=2 执行后,SI=567AH 2 eaxledx 执行后,SI=5 4.LDS、LES 语法格式: LDS reg16 mem 32 reg16=mem32的低字,DS=mem32的高字 LES reg16, mem32 reg16=mem32的低字,ES=mem32的高字 对标志位的影响:无。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 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 lea si, 2[eax][edx] ; 执行后,SI = 5 4. LDS、LES 语法格式: LDS reg16, mem32 ; reg16 = mem32的低字,DS = mem32的高字 LES reg16, mem32 ; reg16 = mem32的低字,ES = mem32的高字 对标志位的影响:无
3.3.1数据传送指令 5.堆栈操作指令 80x86系统的堆栈具有如下特点 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 ■堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单 元 ■堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地 址方向移动,而POP操作则刚好相反。 堆栈操作只能以字或双字为单位。 SS:SP指向栈顶。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.3.1 数据传送指令 5. 堆栈操作指令 80x86系统的堆栈具有如下特点: ▪ 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 ▪ 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单 元。 ▪ 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地 址方向移动,而POP操作则刚好相反。 ▪ 堆栈操作只能以字或双字为单位。 ▪ SS:SP指向栈顶