x86支持多种操作数格式。源数据值可以以常数形式给出,或是从寄存器或内存中读出。结果可以存放在寄存器或内存中。因此各种不同的操作数的可能性被分为三种类型,第一种类型是立即数(immediate),用来表示常数值;第二种类型是寄存器(register),它表示某个寄存器的内容;第三种操作数是内存引用,它会根据计算出来的地址(通常称为有效地址)访问某个内存位置。(来源《深入了解计算机系统》第3版P121页)
1.8086的寻址方式(16位的MASM格式)
练习题:假设下面的值存放在指明的内存地址和寄存器中:
地址 |
值 |
0x100 |
0XFF |
0x104 |
0XAB |
0x108 |
0X13 |
0x10C |
0X11 |
寄存器 |
值 |
BX |
0x100 |
CX |
0x1 |
DI |
0x3 |
填写下表,给出所示操作数的值:
操作数 |
值 |
注释 |
BX |
0X100 |
寄存器寻址 |
[0x104] |
0XAB |
直接寻址 地址0x104 |
0x108 |
0x108 |
立即寻址 |
[BX] |
0XFF |
寄存器间接寻址 地址0x100 |
4[BX] |
0XAB |
寄存器相对寻址 地址0x104 |
9[BX][DI] |
0X11 |
基址变址寻址 地址 0x10c |
2. 32位/64位的寻址方式(ATT格式)
练习题:假设下面的值存放在指明的内存地址和寄存器中:(32位同)
地址 |
值 |
0x100 |
0XFF |
0x104 |
0XAB |
0x108 |
0X13 |
0x10C |
0X11 |
寄存器 |
值 |
%rax |
0x100 |
%rcx |
0x1 |
%rdx |
0x3 |
填写下表,给出所示操作数的值:
操作数 |
值 |
注释 |
%rax |
0x100 |
寄存器 |
0x104 |
0xAB |
绝对地址 |
$0x108 |
0x108 |
立即数 |
(%rax) |
0xFF |
地址0x100 |
4(%rax) |
0xAB |
地址0x104 |
9(%rax, %rdx) |
0x11 |
地址0x10c |
260(%rcx, %rdx) |
0x13 |
地址0x108 |
0xFC(, %rcx, 4) |
0xFF |
地址0x100 |
(%rax, %rdx, 4) |
0x11 |
地址0x10c |