为什么要学AT&T汇编呢?因为喜欢Linux。
关于intel汇编和AT&T汇编的区别,参考LinuxC一站式编程:
要彻底搞清楚C语言的原理,必须要深入到指令一层去理解。你写一行C代码,编译器会生成什 么样的指令,要做到心中有数。
x86 汇编的两种语法:intel 语法和AT&T 语法
x86汇编一直存在两种不同的语法,在intel 的官方文档中使 用intel 语法,Windows也使用intel 语法,而UNIX 平台的汇编器一 直使用AT&T语法,所以本书使用AT&T语法。mov %edx,%eax 这条 指令如果用intel 语法来写,就是mov eax,edx,寄存器名不加%号, 并且源操作数和目标操作数的位置互换。本书不详细讨论这两种 语法之间的区别,读者可以参考 。
介绍x86汇编的书很多,UNIX 平台的书都采用AT&T语法 ,其它书一般采用intel 语法。
具体的错误是:
# 汇编时
$ as test.s -o test.o
test.s: Assembler messages:
test.s:23: Error: invalid instruction suffix for `push'
test.s:29: Error: invalid instruction suffix for `pop'
原因在于在64位上汇编32位代码。
解决方法:
在代码开头添加 .code32 。