novice 发表于 2015-5-31 14:16

(小小总结)Intel 记法与 AT&T 记法的主要不同之处

使用情况
Windows 工具链通常使用 Intel 语法,Linux(准确地说是 Unix 家族) 工具链通常会使用 AT&T 语法。
比如,Windows 上的 OllyDbg、WinDbg、IDA 等均采用 Intel 记法。Linux 上面的 gdb、objdump、gcc、as 等默认均采用 AT&T 记法。
当然,情况不总是这样子,比如 Linux 上的 edb 便是采用 Intel 记法。另外,gdb、objdump 等 Linux 平台的工具也都可以设置为 Intel 记法。


明显的差异

[*]立即操作数、寄存器操作数和绝对地址操作数的表示


[*]AT&T 记法里 立即操作数 带有前导 $,Intel 记法没有
[*]AT&T 记法里 寄存器操作数 带有前导 %,Intel 记法没有
[*]AT&T 记法里 绝对地址操作数(跳转与调用) 带有前导 *,Intel 记法没有
[*]源操作数与目的操作数的顺序


[*]AT&T 记法采用与 Intel 记法相反的源操作数、目的操作数顺序
[*]但是 bound、invlpga 和带两个立即操作数的指令(比如 enter)不采用相反的顺序
[*]内存操作数大小的表示


[*]AT&T 记法由 指令助记符的后缀 确定内存操作数的大小

[*]b:byte,8 比特
[*]w:word,16 比特
[*]l:long,32 比特
[*]q:quadruple word,64 比特
[*]Intel 记法则是由 内存操作数的前缀 确定其大小

[*]byte ptr:字节,8 比特
[*]word ptr:字,16比特
[*]dword ptr:双字,32比特
[*]qword ptr:四字,64比特
[*]远跳转、调用与返回的记法


[*]AT&T 远跳转、调用记法:ljmp/lcall $section, $offset;Intel 为 jmp/call far section:offset
[*]AT&T 远返回记法:lret $stack-adjust;Intel 为 ret far $stack-adjust


参考资料与阅读材料

[*]《Using as》 9.15.3.1 AT&T Syntax versus Intel Syntax


发贴,预防帐号被回收。


页: [1]
查看完整版本: (小小总结)Intel 记法与 AT&T 记法的主要不同之处