我在汇编程序中实现了一个C定义的函数。功能如下
extern void swapNums(float* one,float* two,float* three);
A)swapNums接受3个浮点数的引用,然后将这3个值中的最小值放在“1”中,中间值放在“2”中,将三个值中的最大值放在“3”中。
我想知道:
哪些寄存器用于存储3个浮点数的引用, 即它是rsi,rdi,rdx ......还是xmm0,xmm1,xmm3 ...
如何更改* one,* two,* three中的值以便我能满足A)
当函数的参数按值传递时,我习惯于在汇编程序中实现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文件的目标文件
答案 0 :(得分:3)
我已经the exact same problem了,我想出来了。
[rdi]
包含字面地址,rdi
将指向&#39;存储在该地址的值;因此,这三个地址将存储在rsi
,rdx
和rcx
(Linux和Mac OS / X)中;或rdx
,r8
和movss 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中它们都在与整数值相同的寄存器中传递