簡體   English   中英

如何在 MacOS 上正確使用“寫入”系統調用來打印到標准輸出?

[英]How to correctly use the "write" syscall on MacOS to print to stdout?

我看過類似的問題,但似乎找不到我的代碼有什么問題。

我試圖在 MacOS 上進行“寫入”系統調用以將字符串打印為標准 output。

我能夠完美地使用printf來完成它,並且熟悉在 x64 程序集中調用其他函數。

然而,這是我第一次嘗試syscall

我正在使用 GCC 的 GAS 匯編器。

這是我的代碼:

.section __TEXT,__text

.globl _main

_main:
    pushq %rbp
    movq %rsp, %rbp

    subq $32, %rsp

    movq $0x20000004, %rax
    movq $1, %rdi
    leaq syscall_str(%rip), %rsi
    movq $25, %rdx
    syscall

    jc error

    xorq %rax, %rax

    leave
    ret

error:
    movq $1, %rax
    leave
    ret

.section __DATA,__data
syscall_str:
    .asciz "Printed with a syscall.\n"

似乎沒有任何錯誤; 根本沒有任何內容寫入stdout

我知道start通常用作 MacOS 上可執行文件的起點,但它不會用 GCC 編譯。

您可以嘗試采用多種方法來解決此問題。

確保您為 %rax 寄存器使用了正確的值。 write 系統調用在不同的系統上有不同的編號。 在 macOS 上,寫入系統調用的編號為 0x2000004。

確保您為寫入系統調用使用了正確的 arguments。 寫入系統調用需要以下 arguments:

%rdi:要寫入的文件描述符(例如 1 表示標准輸出) %rsi:指向包含要寫入的數據的緩沖區的指針 %rdx:要寫入的字節數 確保您使用正確的指令來調用系統調用. 在 macOS 上,您應該使用 syscall 指令來調用系統調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM