问题描述
我正在读一本关于如何为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编写的,我希望能够为我的OS组装x86程序集。
我在某处读到可以通过指定选项--32
来做到这一点,例如:as --32 exit.s -o exit.o
,但是这样做,我会收到与以前相同的错误。
如何在x86_x64体系结构上汇编x86源代码?
解决方法
此代码有两个问题:
mov1 $0,%ebx
应为movl
,(请参见1
和l
之间的区别,在某些字体中它们是相同的。)
另一个是次要的,就是缺少的换行符,只需在文件末尾插入一个。
要汇编文件,请使用as --32 exit.s -o exit.o
(假设使用64位汇编器)