Assembly 符号';a1和x27;未定义(汇编语言)

Assembly 符号';a1和x27;未定义(汇编语言),assembly,nasm,Assembly,Nasm,我是汇编编程新手,我正在尝试编译/汇编我在一本书中找到的以下代码。我正在使用nasm,但我不断遇到以下错误: 错误:符号“a1”未定义 我不知道如何解决这个问题。我试着在我的ubuntu(64位)主机上编译这个,也试着在Freebsd 32位虚拟机上编译,两次我都遇到了同样的错误 global _start _start: xor eax,eax jmp short string code: pop esi push byte 15 push esi push byte 1 mov a1,4

我是汇编编程新手,我正在尝试编译/汇编我在一本书中找到的以下代码。我正在使用nasm,但我不断遇到以下错误:

错误:符号“a1”未定义

我不知道如何解决这个问题。我试着在我的ubuntu(64位)主机上编译这个,也试着在Freebsd 32位虚拟机上编译,两次我都遇到了同样的错误

global _start
_start:
xor eax,eax


jmp short string
code:
pop esi
push byte 15
push esi
push byte 1
mov a1,4
push eax
int 0x80


xor eax,eax
push eax
push eax
mov a1,1
int 0x80


string:
call code
db 'Hello world !', 0x0a

那应该是
mov al,4
。它是小写的L,不是数字1,所以你有。同上,移动al,1再向下。

al(如字母“L”,而不是数字“1”)。它的意思是“寄存器A的低位字节”。类似地,“ah”是16位寄存器“A”的高位字节,“ax”是两个字节。而且,
推送字节1
基本上没有意义。对于
推送
,字节操作数大小是不可能的,只有16位或32位
push strict byte 1
将指定立即数的编码方式,但NASM已将其编码为
push imm8
,因为该数字足够小。非常感谢,它工作正常,编译无误。但是,当我尝试在我的FreeBSD上运行时,我又遇到了一个问题,它说“Exec格式错误。二进制文件不可执行。”尽管我按照所有说明并使用“ld-s-o hello.o”链接。你知道为什么会这样吗?@尤兰佩雷拉:不,我不知道。请单独提问。好的,谢谢你的帮助:)@YuranPereira:FreeBSD和Linux在类似的机器代码周围使用不同的可执行元数据。可能您使用Linux的链接器制作了一个Linux可执行文件,并尝试在FreeBSD上运行它。FreeBSD对系统调用也使用与Linux不同的ABI/调用约定,特别是对32位可执行文件。直接进行系统调用是特定于操作系统的;不要假设asm源代码可移植到任何其他操作系统。例如,您问题中的代码只在32位x86 FreeBSD上工作-它在堆栈上传递系统调用参数,而不是寄存器。在BSD上进行所有的组装和链接。@YuranPereira:我同意Nate的观点;你需要问一个单独的问题。确保包含您使用的确切命令,并且您肯定在FreeBSD虚拟机中运行了所有内容。还包括
文件/my_程序的输出
以及
ld--version