核心提示:第 5章 微机CPU的指令系统指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。如果不熟悉汇编指令的功能及其有关规定,那么,肯定不 能灵活运用汇编语言。所以,本章的内容是学习本课程的重点和难点。5.1 汇编语言指令格式为了介绍指令系统中指令的功能,先要清楚汇编语言是如何书写指令的...
3、交换指令XCHG(Exchange Instruction)
交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同。其指令格式如下: XCHG Reg/Mem, Reg/Mem 该指令的功能和MOV指令不同,后者是一个操作数的内容被修改,而前者是两个操作数都会发生改变。寄存器不能是段寄存器,两个操作数也不能同时为内存变量。 XCHG指令的功能如图5.3所示。 |
|
例5.2 已知:AX=5678H,BX=1234H,指令XCHG AX, BX执行后,AX和BX的值是什么?
解:这是两个寄存器内容进行交换,指令执行后,有:(AX)=1234H,(BX)=5678H。
4、取有效地址指令LEA(Load Effective Address)
指令LEA是把一个内存变量的有效地址送给指定的寄存器。其指令格式如下: LEA Reg, Mem 该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。其功能如右图所示。 例如: |
|
|
… |
|
BUFFER |
DB 100 DUP(?) |
|
… |
||
LEA |
BX, BUFFER ;把字节变量BUFFER在数据段内的偏移量送给BX |
|
… |
问题:指令“LEA BX BUFFER”和“MOV BX, OFFSET BUFFER”的执行效果是一样的吗?指令“LEA BX,[BX 200]”和“MOV BX,OFFSET [BX 200]”二者都正确吗?
5、取段寄存器指令(Load Segment Instruction)
该组指令的功能是把内存单元的一个“低字”传送给指令中指定的16位寄存器,把随后的一个“高字”传给相应的段寄存器(DS、ES、FS、GS和SS)。其指令格式如下:
LDS/LES/LFS/LGS/LSS Reg, Mem
指令LDS(Load Data Segment Register)和LES(Load Extra Segment Register)在8086CPU中就存在,而LFS和LGS(Load Extra Segment Register)、LSS(Load Stack Segment Register)是80386及其以后CPU中才有的指令。
若Reg是16位寄存器,那么,Men必须是32位指针;若Reg是32位寄存器,那么,Men必须是48位指针,其低32位给指令中指定的寄存器,高16位给指令中的段寄存器。指令的执行结果如图5.5所示。
|
|
|
例如: |
||
|
… |
|
POINTER DD 12345678H |
||
… |
||
LDS |
BX, POINTER |
|
… |
||
指令的执行结果如图5.5所示。各寄存器的内容分别为:(BX)=5678H,(DS)=1234H。 |
下面控件是学习和掌握MOV、MOVSX/MOVZX、XCHG、LEA、LDS/LES/LFS/LGS/LSS指令的,它可检查用户输入这些指令的合法性,并对合法的指令显示其执行的结果。
注意:如果指令中含有表示内存单元的寻址方式,那么其控件中的"内存单元的类型"即表示该指令中内存单元的数据类型。
6、堆栈操作指令(Stack Operation Instruction)
堆栈是一个重要的数据结构,它具有“先进后出”的特点,通常用来保存程序的返回地址。它主要有两大类操作:进栈操作和出栈操作。
1)、进栈操作
、PUSH(Push Word or Doubleword onto Stack)
指令格式:PUSH Reg/Mem
PUSH Imm ;80286
一个字进栈,系统自动完成两步操作:SP←SP-2,(SP)←操作数;
一个双字进栈,系统自动完成两步操作:ESP←ESP-4,(ESP)←操作数。
、PUSHA(Push All General Registers)
指令格式:PUSHA ;80286
其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。
、PUSHAD(Push All 32-bit General Registers)
指令格式:PUSHAD ;80386
其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。
2)、出栈操作
、POP(Pop Word or Doubleword off Stack)
指令格式:POP Reg/Mem
弹出一个字,系统自动完成两步操作:操作数←(SP),SP←SP-2;
弹出一个双字,系统自动完成两步操作:操作数←(ESP),ESP←ESP-4。
、POPA(Pop All General Registers)
指令格式:POPA ;80286
其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。其实,程序员不用记住它们的具体顺序,只要与指令PUSHA对称使用就可以了。
、POPAD(Pop All 32-bit General Registers)
指令格式:POPAD ;80386
其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它与PUSHAD对称使用即可。
8、I/O指令
有关I/O指令将在第8.1.2节——I/O指令——中介绍,在此从略。
5.2.2 标志位操作指令
标志位操作指令是一组对标志位置位、复位、保存和恢复等操作的指令。
1、进位CF操作指令
、清进位指令CLC(Clear Carry Flag):CF←0
、置进位指令STC(Set Carry Flag):CF←1
、进位取反指令CMC(Complement Carry Flag):CF←not CF
2、方向位DF操作指令
、清方向位指令CLD(Clear Direction Flag):DF←0
、置方向位指令STD(Set Direction Flag):DF←1
3、中断允许位IF操作指令
、清中断允许位指令CLI(Clear Interrupt Flag):IF←0
其功能是不允许可屏蔽的外部中断来中断其后程序段的执行。
、置中断允许位指令STI(Set Interrupt Flag):IF←1
其功能是恢复可屏蔽的外部中断的中断响应功能,通常是与CLI成对使用的。
4、取标志位操作指令
、LAHF(Load AH from Flags):AH←Flags的低8位
、SAHF(Store AH in Flags):Flags的低8位←AH
5、标志位堆栈操作指令
、PUSHF/PUSHFD(Push Flags onto Stack):把16位/32位标志寄存器进栈;
、POPF/POPFD(Pop Flags off Stack):把16位/32位标志寄存器出栈;
6、逻辑操作指令的小结
下面是学习标志位指令的控件,浏览者可以运用此类指令,观看标志寄存器的相应变化。