2016-05-31 46 views
0

我尝试修改传递给C程序中的汇编函数的一些参数。 我已经在x86程序集中尝试过它,但在x64中它似乎不再有效。从C程序调用的Intel x64汇编函数如何修改参数传递的参数

section .text 
global f 
f: 
    push rbp 
    mov rbp, rsp 
    ;[rbp+8] bitmap beginning address (unsigned*) ? 
    ;[rbp+12] bitmap width (int*) ? 
    ;[rbp+16] bitmap height (int*) ? 
    ;[rbp+20] current X pos (double*) ? 
    ;[rbp+24] current Y pos (double*) ? 

    mov rax, [rbp+12] 

    mov rcx, [rax] 
    inc rcx 
    mov [rax], rcx 

    mov rsp, rbp 
    pop rbp 
    ret 
+3

x86_64的具有 – technosaurus

+1

X86-64使用寄存器不同的调用约定比86(如果需要的话堆栈)来传递参数。您需要查看调用约定的[64位System V ABI](http://www.x86-64.org/documentation/abi.pdf)。 –

+2

那么,那些偏移量对我来说看起来不是'64位':( –

回答

1

参数传递给C中的函数的方式取决于调用约定

这里,修改参数的方式使用x86调用约定属性(参数通过堆栈传递)。但在x86_64中,调用约定是不同的(并且可能会因编译器而异)。参数通常通过寄存器传递,因此修改堆栈不会修改参数。

你可以看到list of x86 calling convention on Wikipedia

+0

他实际上并没有试图修改函数参数,他们是指针,他是解除引用。这个问题只是错误的标题,应该是“通过引用”或什么的。他试图加载一个指针(进入' rax')并修改它指向的数据。 –