当参数通过引用传递时,在汇编程序x86中实现C函数

时间:2016-09-14 10:57:01

标签: c assembly x86

我在汇编程序中实现了一个C定义的函数。功能如下

extern void swapNums(float* one,float* two,float* three);

A)swapNums接受3个浮点数的引用,然后将这3个值中的最小值放在“1”中,中间值放在“2”中,将三个值中的最大值放在“3”中。

我想知道:

  1. 哪些寄存器用于存储3个浮点数的引用, 即它是rsi,rdi,rdx ......还是xmm0,xmm1,xmm3 ...

  2. 如何更改* one,* two,* three中的值以便我能满足A)

  3. 当函数的参数按值传递时,我习惯于在汇编程序中实现C函数。例如,在处理浮点参数时,我遵循以下约定:

    section .data
    
        global <name of function>
    
    <name of function>:
        movss [x1], xmm0 ; move the first parameter into memory location x1
        movss [x2], xmm1 ; move the second parameter into memory location x2
        movss [xNorm], xmm2 ; move the third parameter into memory location x3
    

    然后在创建可执行文件时链接.asm和.c文件的目标文件

2 个答案:

答案 0 :(得分:3)

我已经the exact same problem了,我想出来了。

[rdi]包含字面地址,rdi将指向&#39;存储在该地址的值;因此,这三个地址将存储在rsirdxrcx(Linux和Mac OS / X)中;或rdxr8movss xmm0, [rdi](Windows)。

然后将需要比较的实际值移到需要使用的SSE寄存器movss [rdi], xmm0

最后,为了让浮动回到C程序,您需要使用xmm0:这会将rdi的值移到onLogon(View view)指向&{39}的位置#39;到。

答案 1 :(得分:2)

C中没有通过引用传递,因为C中没有引用。当用C编程时,不要使用&#34;引用&#34;,忘记它甚至存在。 C中的所有值都是按值传递的,因为它们是值,而不是不存在的引用。指针是值,如果不清楚的话。 (严格来说,指针的值是对另一个对象的引用,因此我们不能完全忘记&#34;引用&#34;,但这在学习C时确实会让人感到困惑。)

当编写x86_64(你的问题暗示x86_64,而不是你的标题所提到的x86)汇编程序时,所有指针的处理方式完全相同,无论它们指向何种类型,在函数调用ABI中它们都在与整数值相同的寄存器中传递