[英]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.