【发布时间】:2020-12-17 17:46:03
【问题描述】:
我正在阅读一本关于如何为 x86 Linux 编写程序集的书。
我想在我的 x86_x64 Linux 操作系统上汇编以下汇编源代码(exit.s):
.section .data
.section .text
.globl _start
_start:
mov1 $1, %eax
mov1 $0, %ebx
int $0x80
通过调用这个命令:as exit.s -o exit.o
但是,汇编程序退出并出现以下错误:
exit.s: Assembler messages:
exit.s: Warning: end of file not at end of a line; newline inserted
exit.s:6: Error: no such instruction: `mov1 $1,%eax'
exit.s:7: Error: no such instruction: `mov1 $0,%ebx'
据我所知,x86_x64 Linux 的指令集与 x86 不同,因此出现了错误。通过将mov1 替换为mov,汇编程序成功编译。但是,鉴于本书的其余部分是为 x86 编写的,我希望能够为我的操作系统组装 x86 程序集。
我在某处读到,可以通过指定选项 --32 来做到这一点,例如:as --32 exit.s -o exit.o,但这样做时,我收到与以前相同的错误。
如何在 x86_x64 架构上组装 x86 源代码?
【问题讨论】:
-
mov1即使对于正确的 32 位 x86 程序集也无效。您可能想要movl(最后一个字符是L)。但这并不能解决您的问题,要使用您想要编译成 32 位应用程序的 int 80h API。 -
试试stackoverflow.com/questions/36861903/…中给出的
gcc命令 -
谢谢。是的,我把 l 误认为是 1。使用 gcc 编译器有效。
-
顺便说一句,正如该答案列出的那样:“使用
-v让 gcc 向您显示它运行的用于组装和链接的命令。”