我找不到在64位nasm程序集中使用write syscall的正确方法。它只是打印随机标志。我已经检查了系统上的系统调用号码。
section .data
string db 'Hello World'
section .text
global main
main:
mov rax, 1 ; syscall number for write
mov rbx, 1 ; use stdout
mov rcx, qword string ; 64bit adress of my string
mov rdx, 11 ; length of my string
syscall
mov rax, 60 ; syscall number for exit
mov rbx, 0 ; return code
syscall
答案 0 :(得分:1)
amd64(aka x86-64)的调用约定与i386的调用约定不同。例如,第一个函数参数进入RDI。测试中使用的寄存器分配与i386 Linux系统调用样式匹配,而不是x86-64样式。最后,除了系统调用号本身之外,你没有在适当的位置发送任何值。
This page对正确的方法有一些注意事项(但它错过了内核调用情况的寄存器更改)。 This document是原始规范。 @Michael在他对你的问题的评论中所显示的链接几乎相同,但没有详细的基础,而对于系统调用的开发更为实用。请关注他们以便将来的活动。