机器语言指令概述
6.4 机器语言指令概述
用汇编语言指令编写的汇编语言程序输入计算机后,计算机并不能识别和执行,必须由机器提供的汇编程序将它翻译成由机器语言指令组成的程序,才能由计算机执行。通常这种翻译工作不必由人来干预。本节只简单介绍一下机器语言指令的构成,以便读者在实际应用(实时控制)中也可完成类似的转换工作。
8086/8088的机器语言指令为可变字节的指令,一条指令可以由1~7个字节组成,因此指令格式比较灵活。其格式如下所示:
其中,opcode为操作码字段;d指示操作方向;S表示符号扩展;W指示操作数宽度;mod用来区分是寄存器寻址还是存储器寻址;reg寄存器编码;r/m寄存器或存储器; disp-low位移量低位;disp-high位移量高位;data-low立即数低位;data-high立即数高位。
格式中给出了1~6个字节的情形。如果指令中显示指定段跨越前缀,则在机器语言指令中使用放在该指令之前的一个字节来表示,其格式如下所示:
其中,001和110均为段前缀标志;SEG指定四个段寄存器中的一个,00为ES,01为CS,10为SS,11为DS。
6.4.1 操作码的机器语言表示
操作码一般占用第一个字节的7~2位,但有些指令的操作码占用第一个字节的7~1位,甚至还可能占用第二个字节的5~3位作为扩展操作码。
在多数操作码中,常使用某些位来指示某些信息。例如第一个字节中的W位用来指示该指令是对字节(W=1)还是对字节(W=0)进行操作。在双操作数指令中,d位指定寄存器是用于目的操作数(d=1)还是用于源操作数(d=0)。另外,在立即寻址方式的指令中,S位表示符号扩展,若立即数为8位,6
.4.2寻址方式的机器语言表示
指令中除操作码占用的位数外,其它位则用来表示操作数或操作数的地址。8086/8088用一个寻址方式字节来表示操作数的寻址方式,它通常是机器指令的第二个字节。
第二个字节中的reg字段表示寻址方式为寄存器方式,在双操作数指令的情况下,由reg和第一个字节中的W位联合指定一个寄存器作为两个操作数中的一个操作数。Reg与W位联合指定的寄存器如表6-4-1所示。
第二个字节中的mod字段与r/m字段相结合以确定另一个操作数的寻址方式。其中:
Mod=00时为无位移量字节的存储器寻址方式。由r/m字段指定确切的寻址方式,其中当r/m=110时指定为直接寻址方式,此时指令中跟有16位位移量D16,用来指出操作数的偏移地址。
Mod=01时为带一个位移量字节的存储器寻址方式。由r/m字段指定确切的寻址方式。其中位移量字节为一个带符号数,因此它的范围是-128~+127。当用这个位移量D8计算存储器地址时,它将被符号扩展成16位。
Mod=10时为带两个位移量字节的存储器寻址方式。由r/m字段指定确切的寻址方式。第一个偏移量字节是偏移量的低8位,第二个偏移量字节是偏移量的高8位。这个16位的位移量也是一个带符号数,因此它的范围是-32768~+32767。
Mod=11时为寄存器寻址方式。r/m字段表示寄存器,也是与第一个字节的W位一起确定一个寄存器。 Mod字段与r/m字段联合使用确定寻址方式由表6-4-2给出。