正确的方法来使用write syscall linux

时间:2013-12-20 12:30:17

标签: linux assembly stdout nasm system-calls

我找不到在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

1 个答案:

答案 0 :(得分:1)

amd64(aka x86-64)的调用约定与i386的调用约定不同。例如,第一个函数参数进入RDI。测试中使用的寄存器分配与i386 Linux系统调用样式匹配,而不是x86-64样式。最后,除了系统调用号本身之外,你没有在适当的位置发送任何值。

This page对正确的方法有一些注意事项(但它错过了内核调用情况的寄存器更改)。 This document是原始规范。 @Michael在他对你的问题的评论中所显示的链接几乎相同,但没有详细的基础,而对于系统调用的开发更为实用。请关注他们以便将来的活动。