首页 百科知识 位扩展指令的应用

位扩展指令的应用

时间:2022-10-17 百科知识 版权反馈
【摘要】:32位处理器扩展指令的使用方法与8086指令系统的用法基本相同,如果在一个汇编语言中使用32位扩展指令,可给程序的编写带来一定的方便,但并不意味着使用32位扩展指令的程序就工作在保护模式。这种情况在间接寻址、变址寻址时也必须使用32位寄存器如:在利用32位扩展指令编写实地址模式应用程序时,也可在段定义时指定为16位的段操作,这样使用32位扩展指令和32位寄存器的应用程序与8086/8088和80286完全相同。

2.7.3 32位扩展指令的应用

32位处理器扩展指令的使用方法与8086指令系统的用法基本相同,如果在一个汇编语言中使用32位扩展指令,可给程序的编写带来一定的方便(如堆栈操作指令PUSHA),但并不意味着使用32位扩展指令的程序就工作在保护模式。使用32位扩展指令与处理器的工作方式无关(除特权指令和保护模式下的指令),使用32位扩展指令的目的在于使编写程序更方便和更精练,执行效率更高。

1.处理器说明伪指令

在应用程序中要使用32位处理器扩展指令,首先必须在程序的开始处说明其处理器的类型,常见的处理器伪指令类型如下:

.386/.386P:.386伪指令允许程序使用8086/8088~80386等处理器的指令,同时也允许使用8087~80387的指令系统,用.386伪指令编写的程序能在386以上的计算机上运行。.386P允许使用80286、80386处理器的特权指令。

.586/.586P:.586伪指令允许程序使用8086/8088~Pentium等处理器的指令,同时也允许使用协处理器指令,用.586伪指令编写的程序能在Pentium以上的计算机上运行。

.MMX:允许使用Pentium MMX处理器的多媒体指令集,编译系统必须用MASM 6.11以上的版本。

在应用程序中如果没有指定处理器,伪指令、宏汇编程序MASM将采用下列缺省值:8086/.8088指令系统、8087协处理器指令系统和IEEE格式的浮点变量。

2.32位实模式汇编程序设计

在实地址模式下,如何把一个8086/8088汇编程序部分功能用32位扩展指令来实现,以便更充分、高效地发挥处理器的效率。一般使用80286的扩展指令来编写应用程序,只要在程序的开始处加上.386伪指令,在程序中就可以直接使用32位CPU的32位扩展指令和32位运算。对于32位的处理器,在使用32位扩展指令时,数据的运算和移位操作等与8086/8088相同。

在使用32位扩展指令时,凡是与地址有关的操作,由于32位处理器采用32位地址总线,因此最好使用32位的寄存器(如EBX、EDX等),如显示字符串程序段。

img158

img159

如果在.386处理器伪指令说明时,直接使用MOV DX,OFFSET MESG指令,在屏幕上显示的将不是正确的字符串(MESG)。这种情况在间接寻址、变址寻址时也必须使用32位寄存器如:

img160

例2-52 用32位处理器的32位寄存器编写一个文本读取和显示程序。

img161

img162

在利用32位扩展指令编写实地址模式应用程序时,也可在段定义时指定为16位的段操作,这样使用32位扩展指令和32位寄存器的应用程序与8086/8088和80286完全相同。段的定义方法是:

段名 SEGMENT USE16/USE32

……段名 ENDS USE16/USE32两种方式的主要差别在于:操作数和地址是16/32位,堆栈操作使用16/32位的堆栈指针,段的大小是64KB/4GB。

例2-53 USE16段定义实现两个32位的数运算,它进行12345678H×9abcdef0H的乘法运算,结果为64位(ab00ea4e242d2080H),并用DOS系统功能显示在屏幕上。

img163

img164

该例程说明,在使用16位的段操作时,对于32位扩展指令仍然可以使用,仍可以做32位的数据运算,使用32位的寄存器等。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈