segreg:[base+index*scale+disp]
,而
AT&T
的格式是
%segreg:disp(base,index,scale)
。其中
index/scale/disp/segreg
全部是可选的,完全可以简化掉。如果没有指定
scale
而指定了
index
,则
scale
的缺省值为
1
。
segreg
段寄存器依赖于指令以及应用程序是运行在实模式
还是保护模式下,在实模式下,它依赖于指令,而在保护模式下,
segreg
是多余的。在
AT&T
中,当立即数用在
scale/disp
中时,不应当在其前冠以“
$”
前缀,表
2.3
给出其语
法及几个相应的例子。
表
2.3
内存操作数的语法及举例
Intel 语法 AT&T 语法
指令 foo,segreg:[base+index*scale+disp] 指令 %segreg:disp(base,index,scale),foo
mov eax,[ebx+20h] Movl0x20(%ebx),%eax
add eax,[ebx+ecx*2h Addl (%ebx,%ecx,0x2),%eax
lea eax,[ebx+ecx] Leal (%ebx,%ecx),%eax
sub eax,[ebx+ecx*4h-20h] Subl -0x20(%ebx,%ecx,0x4),%eax
从表中可以看出,
AT&T
的语法比较晦涩难懂,因为
[base+index*scale+disp]
一眼就可
以看出其含义,而
disp(base,index,scale)
则不可能做到这点。
这种寻址方式常常用在访问数据结构数组中某个特定元素内的一个字段,其中,
base
为数组的起始地址,
scale
为每个数组元素的大小,
index
为下标。如果数组元素还
是一个结构,则
disp
为具体字段在结构中的位移。
5
.操作码的后缀
在上面的例子中你可能已注意到,在
AT&T
的操作码后面有一个后缀,其含义就是
指出操作码的大小。“
l”
表示长整数(
32
位),“
w”
表示字(
16
位),“
b”
表示字节
(
8
位)。而在
Intel
的语法中,则要在内存单元操作数的前面加上
byte ptr
、
word ptr,
和
dword ptr
,“
dword”
对应“
long”
。表
2.4
给出几个相应的例子。
表
2.4
操作码的后缀举例