第六章32位指令及其编程 本节介绍的指令基于386以前的CPU。 本节也介绍了一些80386的新增指令。但本节介绍 的新增指令属于原有指令扩大了工作范围,或在原有功 能的基础之上有所增强。具有新功能的指令放在6.4节 (32位新增指令)介绍。 介绍指令时使用的符号: 新增:r328个32位通用寄存器;m3232位存储 单元;i3232位立即数;seg—加FS和GS。 「回62
第 六 章 32 位 指 令 及 其 编 程 概 述/2 21 本节介绍的指令基于386以前的CPU。 本节也介绍了一些80386的新增指令。但本节介绍 的新增指令属于原有指令扩大了工作范围,或在原有功 能的基础之上有所增强。具有新功能的指令放在6.4节 (32位新增指令)介绍。 介绍指令时使用的符号: 新增:r32—8个32位通用寄存器;m32—32位存储 单元;i32—32位立即数;seg—加FS和GS。 回 6.2
第六章32位指令及其编程 6.2.1数据传送类指令 1.通用传送 1)Mo类:格式、功能与16位M0V指令相同,只 是增加了对32位操作数和32位寻址方式的支持。 MOV DWORD PTR[D],EAX;16位寻址,32位操作数 M0VAL,[EBP+EB];32位寻址,8(16)位操作数 MOV AH, FS: [5678H] (2)交换指令XCHG:同上 XCHG ESI, ED I/ XCHG [EBX. CX (3)换码指令ⅪAT:16位段,同8086 32位段,用EBX存放基地址
第 六 章 32 位 指 令 及 其 编 程 6.2.1 数据传送类指令1.通用传送 22 6.2.1 数据传送类指令 1.通用传送 ⑴ MOV类:格式、功能与16位MOV指令相同,只 是增加了对32位操作数和32位寻址方式的支持。 MOV DWORD PTR[DI],EAX;16位寻址,32位操作数 MOV AL,[EBP+EBX];32位寻址,8(16)位操作数 MOV AH,FS:[5678H] ⑵交换指令XCHG:同上 XCHG ESI,EDI/ XCHG [EBX],CX ⑶换码指令XLAT:16位段,同8086; 32位段,用EBX存放基地址
第六章32位指令及其编程 2.堆栈操作 PUSH r16/r 32/m16/m32/seg PPr16/r32/m16/m32/seg;CS除外 对32位操作数(E)SP±4 新增指令(扩大范围或增强原有功能) (1) PUSH i8/i16/i32;把16位或32位立即数i16132 压入堆栈。若是8位立即数i8,经符号扩展成16位后再压 人入堆栈。 PUSH 1234H/ PUSH 12345678H (2)PUSH FS/PUSH GS/POP FS/POP GS
第 六 章 32 位 指 令 及 其 编 程 2.堆栈操作/1 23 2.堆栈操作 PUSH r16/r32/m16/m32/seg POP r16/r32/m16/m32/seg ;CS除外 ;对32位操作数(E)SP±4 新增指令(扩大范围或增强原有功能) ⑴ PUSH i8/i16/i32 ;把16位或32位立即数i16/i32 压入堆栈。若是8位立即数i8,经符号扩展成16位后再压 入堆栈。 PUSH 1234H / PUSH 12345678H ⑵ PUSH FS/PUSH GS/POP FS/POP GS
第六章32位指令及其编程 (3) PUSHA;顺序将A/XDX/BX/SP/BP/S|/D|入栈 POPA;按反顺序出栈,但舍弃应进SP的值, 即应进入sP的值被舍弃,并不进入SP, ;SP通过增加16来恢复(调整) (4) PUSHAD;顺序将8个32位寄存器入栈 POPAD;按反顺序出栈,但舍弃应进ESP的值 即应进入ESP的值被舍弃,并不进入ESP ;ESP通过增加32来恢复(调整)
第 六 章 32 位 指 令 及 其 编 程 /2 24 ⑶ PUSHA;顺序将AX/CX/DX/BX/SP/BP/SI/DI入栈 POPA;按反顺序出栈,但舍弃应进SP的值, ;即应进入SP的值被舍弃,并不进入SP, ;SP通过增加16来恢复(调整) ⑷ PUSHAD;顺序将8个32位寄存器入栈 POPAD;按反顺序出栈,但舍弃应进ESP的值, ;即应进入ESP的值被舍弃,并不进入ESP, ;ESP通过增加32来恢复(调整)
第六章32位指令及其编程 3标志传送 LAHF/SAHF/ PUSHF/POPF;同8086指令 CLC/STC/CMC, CLD/STD CLI/STI ;标志位操作指令同8086 新增指令: PUSHFD;将 EFLAGS入栈 POPFD;弹出一个32位数到 EFLAGS
第 六 章 32 位 指 令 及 其 编 程 3.标志传送 25 3.标志传送 LAHF/SAHF/PUSHF/POPF;同8086指令 CLC/STC/CMC,CLD/STD,CLI/STI ;标志位操作指令同8086 新增指令: PUSHFD;将EFLAGS入栈 POPFD;弹出一个32位数到EFLAGS