【Error】AT&T汇编 报错 Error: invalid instruction suffix for `push' 或 pop

版权声明:随意转载,需注明出处。by think_ycx https://blog.csdn.net/think_ycx/article/details/88076959

为什么要学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 。

参考:https://blog.csdn.net/geekdonie/article/details/12792421

猜你喜欢

转载自blog.csdn.net/think_ycx/article/details/88076959