我目前正在学习汇编,我正在使用nasm在64位ubuntu上使用Intel语法。
因此,我找到了两个引用系统调用号的网站:
此为32位寄存器(eax,ebx等):https://syscalls.kernelgrok.com
此64位寄存器(rax,rbx等):https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64
事实是,当我使用64位syscall编号时,我的代码不起作用,但是当我用'r'替换32位寄存器中的'e'时,它起作用了,例如在sys_write中,使用rbx来存储fd而不是rdi,它可以工作。
我现在很迷路。此代码无效:
message db 'Hello, World', 10
section .text
global _start
_start: mov rax,4
mov rdi, 1
mov rsi, message
mov rdx, 13
syscall
mov rax, 1
mov rdi, 0
syscall
运行strace ./my_program
-进行伪造的stat
系统调用,然后进行write
调用,然后成功结束,然后退出段并进行段错误。不是注册名称是您的问题,而是电话号码。您正在使用32位电话号码。