assembly 运行NASM程序集时出现segfault

egdjgwm8  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(165)

我正在尝试从头开始制作ELF,以便更好地理解它们是如何工作的。我尝试了这个简单的程序:

mov eax,1
mov ebx,4
syscall

它应该以代码4退出,但当我汇编(nasm test.asm -o asm.bin)将其放入ELF并运行,但不工作,并且出现segfaults。这可能是ELF的问题,但我不这么认为,因为我尝试了我所遵循的教程的手动汇编,它如预期的那样工作。(手动组装)与nasm生成的不同。(例如,mov rax,0被nasm编码为66 B8 00 00 00 00,而教程将其编码为B8 00 00 00 00,没有前导0x66)。那么我是否遗漏了一些汇编程序标志或类似的东西呢?

7lrncoxx

7lrncoxx1#

66字节指示问题; nasm在默认情况下是以16位模式组装的,因此mov eax,1需要一个操作码大小前缀(66字节)来切换到32位操作。因此,它将指令视为66 B8 01 00,即mov ax,1;现在指令指针未对齐,因此崩溃。
修复方法是将bits 32bits 64(视情况而定)指令放在程序集文件的顶部。

相关问题