汇编语言简明教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.1 指令代码格式

汇编语言程序的主体是处理器指令,了解指令的代码格式有助于理解指令功能。

指令的代码格式(Instruction Format)说明如何用二进制编码指令,也称机器代码(Machine Code)格式,它由操作码和地址码组成。指令的操作码(Opcode)表明处理器执行的操作,例如数据传送、加法运算、跳转等操作。操作数(Operand)是参与操作的数据,也就是各种操作的对象,主要以寄存器或存储器地址、I/O 地址形式指明数据的来源,所以也称为地址码,例如,数据传送指令的源地址和目的地址,加法指令的加数、被加数及和值都是操作数。有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数。多数操作数需要显式指明,有些操作数隐含使用。

8086机器代码的一般格式如图1-9所示。操作码占1或2字节,后面的各字节指明操作数。其中,“mod reg r/m”字段表明寻找操作数的方法(即寻址方式,详见第2章),“位移量”字段给出相对基地址的偏移量,“立即数”字段给出操作数本身。

图1-9 8086机器代码的一般格式

下面通过程序中使用最多的,也是指令系统中最基本的数据传送指令为例简单加以说明。

数据传送指令的助记符是“MOV”(取自Move),功能是将数据从一个位置传送到另一个位置,类似高级语言的赋值语句。可以如下表达:

    mov dest,src         ;dest ← src

src表示要被传送的数据或数据所在的位置,称为源操作数(Source),书写在逗号之后。DEST表示数据将要传送到的位置,称为目的操作数(Destination),书写在逗号之前。注意,后面分号是汇编语言使用的注释符号,表示其后内容是注释,可用于说明指令功能。

例如,将16位寄存器BX的数据传送到AX寄存器的指令,可以书写为:

    mov ax,bx           ;指令功能:AX←BX,指令代码:89 D8(十六进制表示)

其中第1个字节“89”是操作码,表示传送16位数据的MOV指令。第2个字节“D8”表示源操作数BX,目的操作数AX。

再如,将寄存器BX内容加寄存器SI内容,再加6的值作为存储器地址,从该地址单元传送一个字节数据给AL寄存器,可以书写为:

    mov al,[bx+si+6]       ;指令功能:AL←[BX+SI+6]
                        ;机器代码:8A 40 06(十六进制表示)

其中第1个操作码字节“8A”,表示传送8位数据的MOV指令。第2个字节“40”表示目的操作数是AL、源操作数是通过寄存器BX和SI以及8位位移量相加得到存储器偏移地址,而第3个字节“06”正是这个位移量。