远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为 ljmp,lcall,与之
相应的返回指令伪 lret。
例:
INTEL AT&T
CALL FAR SECTION:OFFSET lcall $secion:$offset
JMP FAR SECTION:OFFSET ljmp $secion:$offset
RET FAR SATCK_ADJUST lret $stack_adjust
1.4 间接寻址语法
INTEL 中基地址使用“[”、“ ] ”,而在 AT&T 中使用“(”、“ ) ”;另外处理复杂操作数的
语法也不同,INTEL 为 Segreg:[base+index*scale+disp] ,而在 AT&T 中为
%segreg:disp(base,index,sale),其中 segreg,index,scale,disp 都是可选的,在指定
index 而没有显式指定 Scale 的情况下使用默认值 1。Scale 和 disp 不需要加前缀“&”。
INTEL AT&T
Instr
foo,segreg:[base+index*scale+disp]
instr
%segreg:disp(base,index,scale),foo
1.5 后缀
AT&T 语法中大部分指令操作码的最后一个字母表示操作数大小,“b”表示 byte(一个
字节);“ w ” 表示 word(2 个字节);“ l ” 表示 long(4 个字节)。INTEL 中处理内存操作数
时也有类似的语法如:BYTE PTR、WORD PTR、DWORD PTR。
例:
INTEL AT&T
mov al, bl movb %bl,%al
mov ax,bx movw %bx,%ax
mov eax, dword ptr [ebx] movl (%ebx), %eax
在 AT&T 汇编指令中,操作数扩展指令有两个后缀,一个指定源操作数的字长,另一个
指定目标操作数的字长。AT&T 的符号扩展指令的为“movs”,零扩展指令为“movz”(相应
的 Intel 指令为“movsx”和“movzx”)。 因此,“movsbl %al,%edx”表示对寄存器 al 中的
字节数据进行字节到长字的符号扩展,计算结果存放在寄存器 edx 中。下面是一些允许的操
作数扩展后缀:
l bl: 字节->长字
l bw: 字节->字
l wl: 字->长字
跳转指令标号后的后缀表示跳转方向,“f”表示向前(forward),“b”表示向后(back)。
例: