2013-12-20 46 views
0

我找不到在64位nasm程序集中使用寫入系統調用的正確方法。它只是打印隨機標誌。我已經在系統上檢查了系統調用號碼。使用寫入系統調用的正確方法linux

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

您應該將此問題標記爲'assembly'或'nasm'或類似的。 – 2013-12-20 13:13:28

+2

您使用的寄存器不匹配[此表](http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64)。 – Michael

回答

1

amd64(aka x86-64)的調用約定不同於i386的調用約定。例如,第一個函數參數進入RDI。測試中使用的寄存器分配與i386 Linux系統調用樣式相匹配,而不是x86-64之一。最後,除了系統調用號碼之外,你沒有在適當的位置發送任何值。

This page對正確方法有一些說明(但它沒有改變內核調用情況下的寄存器)。原始規格是This document。 @Michael在他對你的問題的評論中顯示的鏈接實際上是相同的,但沒有詳細的依據,而對於系統調用利用則更實用。請按照他們的未來活動。