我正在尝试从头开始制作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
)。那么我是否遗漏了一些汇编程序标志或类似的东西呢?
1条答案
按热度按时间7lrncoxx1#
66
字节指示问题; nasm在默认情况下是以16位模式组装的,因此mov eax,1
需要一个操作码大小前缀(66
字节)来切换到32位操作。因此,它将指令视为66 B8 01 00
,即mov ax,1
;现在指令指针未对齐,因此崩溃。修复方法是将
bits 32
或bits 64
(视情况而定)指令放在程序集文件的顶部。