本节内容:寄存器寻址方式的操作数在CPU内部的寄存器中,指令中指定寄存器号。
■寄存器寻址方式:16位的寄存器操作数可以是AX、BX、CX、DX、SI、DI、SP、BP共计8个16位通用寄存器;8位寄存器操作数可以是AH、AL、BH、BL、CH、CL、DH、DL共计8个8位寄存器;
7.2.1 寄存器寻址方式
16位的寄存器操作数可以是AX、BX、CX、DX、SI、DI、SP、BP共计8个16位通用寄存器;
8位寄存器操作数可以是AH、AL、BH、BL、CH、CL、DH、DL共计8个8位寄存器。
举例
MOV SI,AX ;将AX寄存器内存储的值赋给SI寄存器。
MOV AL,DH ;将DH寄存器内存储的值赋给AL寄存器。
由于操作数在寄存器中,不需要通过访问存储器来取得操作数,所以采用这种寻址方式
的指令执行速度较快。如图7-3所示,AX寄存器包含两个字节存储单元,其中高字节存储单元AH中存储12H,低字节存储单元AL中存储34H。
图7-3 AX寄存器
动手实验18:演示寄存器寻址方式
如图7-4所示,在debug调试器中输入mov ah,12h;mov al,34h;mov si,ax;三条汇编指令,观察寄存器AH、AL、AX和SI的值。
图7-4 演示寄存器寻址方式
思考
为何MOV AX,1234h、MOV SI,AX这样的寄存器赋值语句称为寻址方式呢?
我们可以理解为CPU内AX、BX、CX等14个寄存器看作是以字母符号命名的寄存器存储单元,内存中的存储单元同样也是由寄存器构成,只是由于内存中的存储单元太多,所以使用地址编号的方式命名。
7.3节 直接寻址方式
本节内容:在指令中直接包含操作数的有效地址称为直接寻址方式。
■直接寻址方式:直接寻址有两种形式,一是直接给出二进制数表示的地址;二是直接给出地址标号。
7.3.1 直接寻址方式
直接寻址方式的操作数在存储器中,指令直接包含有操作数的有效地址。操作数一般存放在数据段,所以操作数的地址由DS加上指令直接给出的16位偏移得到。
如果采用段超越前缀,则操作数也可包含在数据段外的其他段中,如ES、SS段。
图7-5 直接寻址方式
如图7-5所示,设DS=5000H,地址51234H字存储单元的内容是5678H,那么执行MOV AX,[1234H]后AX=5678H。
动手实验19:演示直接寻址方式
如图7-6所示,在debug调试器内输入:
mov ax,5000H;
mov ds,ax;将段值5000H赋给DS段寄存器。
接着输入mov word ptr [1234H],6789H;将6789H存入数据段偏移地址1234H处。
最后输入mov ax,[1234H];将数据段偏移地址1234H处的值6789H送入AX寄存器。
图7-6 演示直接寻址方式
如果在ES段,并使用段超越前缀:MOV ES:[5678H],BL,表示将BL寄存器中的值存储在ES附加段内的偏移地址5678H处。
使用直接寻址方式时,我们很少会直接使用数值表示偏移地址,而是在数据段中,采用数据定义的形式定义一个变量,这个变量称为数据段内的地址标号。
例如下面的数据段定义:
data segment
var dw 6789H
data ends
var dw 6789H 的意思为在数据段地址标号“var”处,以dw字为单位分配2个字节内存空间,并且初始化将其为6789H。
在代码段中,读取数据段内var地址标号对应存储单元内的值:mov ax,ds:[var],这条语句就是典型的直接寻址方式。直接寻址方式常用于处理单个存储器变量的情况,可以在64KB的段内寻找操作数。
谨慎
立即寻址和直接寻址书写的方法不同,直接寻址的地址要放在方括号中,往往用变量名表示。
mov ax,1234h ;立即寻址方式
mov ax,ds:[var];直接寻址方式
本文摘自编程达人系列教材《X86汇编语言基础教程》。