2013-12-02 4 views
2

Я хочу вызвать системный вызов в сборке. Проблема в том, что я не могу mov ecx,rsp. rsp - это 64-разрядный регистр, ecx - это 32-разрядный регистр. Я хочу передать буфер addr в качестве параметра этого syscall. Что я могу сделать? Благодарю.linux assembly: как позвонить в syscall?

section .data 
s0: db "Largest basic function number supported:%s\n",0 
s0len: equ $-s0 

section .text 
global main 
extern write 
main: 
sub rsp, 16 
xor eax, eax 
cpuid 

mov [rsp], ebx 
mov [rsp+4], edx 
mov [rsp+8], ecx 
mov [rsp+12], word 0x0 

mov eax, 4 
mov ebx, 1 
mov ecx, rsp 
mov edx, 4 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, s0 
mov edx, s0len 
int 80h 

mov eax, 1 
int 80h 
+1

Если вы пишете 64-разрядное приложение с, вы должны быть с помощью [64-битный способ делать системные вызовы] (http://blog.rchapman.org/ post/36801038863/linux-system-call-table-for-x86-64)? – Michael

+0

Что с странным сочетанием битности? Я чувствую попытку объединить 32-битный образец в 64-битный проект ... –

ответ

5

Чтобы сделать системный вызов в 64-битном Linux, поместите номер системного вызова в бараках, то свои аргументы, в порядке, в RDI, рисайте, RDX, r10, R8 и R9, затем вызвать системный вызов ,

Вот пример

 .global _start 

     .text 
_start: 
     # write(1, message, 13) 
     mov  $1, %rax    # system call 1 is write 
     mov  $1, %rdi    # file handle 1 is stdout 
     mov  $message, %rsi   # address of string to output 
     mov  $13, %rdx    # number of bytes 
     syscall 

     # exit(0) 
     mov  $60, %rax    # system call 60 is exit 
     xor  %rdi, %rdi    # return code 0 
     syscall 
message: 
     .ascii "Hello, World\n" 
Смежные вопросы