【问题标题】:Assembling x86 assembly source code on x86_x64 architecture在 x86_x64 架构上组装 x86 汇编源代码
【发布时间】: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 向您显示它运行的用于组装和链接的命令。”

标签: assembly x86 x86-64


【解决方案1】:

这段代码有两个问题:

 mov1 $0, %ebx

应该是movl,(看1和l的区别,有些字体是一样的。)

另一个,次要的是缺少换行符,只需在文件末尾插入一个即可。

要汇编文件,请使用as --32 exit.s -o exit.o(假设是 64 位汇编器)

【讨论】:

  • 我已经试过你建议的命令了。我不确定它是否会失败,因为我的汇编程序不是 64 位的(我运行 x86_x64)。有什么方法可以检查我的汇编程序是否是 64 位的?我必须使用 gcc 将其编译为我的操作系统可以执行的 32 位二进制文​​件。
  • @MikeHawkins as --32 收到什么错误消息?修复 mov1 错误后,这应该可以正常工作。
  • 我的评论不正确 - 我的意思是,汇编器成功,但链接器失败并显示以下消息:ld: i386 architecture of input file exit.o' is incompatible with i386:x86-64 output`
  • 这行得通吗? ld -m elf_i386 -o executable file.o 有 ld 支持 32 位输出吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多