我正在尝试将四个32位浮点变量存储到128位浮点变量中,这里是asm代码:
; function signature is:
; int findMin()
section .data
fa: dd 10.0
fb: dd 20.0
fc: dd 12.0
fd: dd 9.0
section .bss
fl_var: reso 1
section .text
global findMin
findMin:
; -------------------------------------------
; Entrace sequence
; -------------------------------------------
push ebp ; save base pointer
mov ebp, esp ; point to current stack frame
push ebx ; save general registers
push ecx
push edx
push esi
push edi
fld dword [fa]
fstp dword [fl_var]
fld dword [fb]
fstp dword [fl_var + 4]
fld dword [fc]
fstp dword [fl_var + 8]
fld dword [fd]
fstp dword [fl_var + 12]
mov eax, 0
; ------------------------------------------
; Exit sequence
; ------------------------------------------
pop edi
pop esi
pop edx
pop ecx
pop ebx
mov esp, ebp
pop ebp
ret
对于每个fn浮点变量,我使用st0寄存器将其移动到fl_var中,使用适当的偏移量。
代码不起作用,问题在于fn浮点变量的声明。如果我尝试使用gdb打印它们,我得到这个:
f/fh &fa //print a 32-bit float
0x804a020 <fa>: 0
其他fn变量也是如此。
如果写:
f/fw &fa //print a 64-bit float
0x804a020 <fa>: 10
打印正确的价值!其他fn变量也会发生同样的情况。 因此,即使我将fa声明为dd(4个字节),它也会创建一个dq(8个字节)。有一种方法可以在asm中声明一个32位浮点数吗? 我找到了类型real4,但编译器抱怨。
修改 关于gdb的另一个问题以及它打印变量的方式。看看这段代码:
;int findMin(float a, float b, float c, float d)
section .bss
int_var: reso 2
section .text
global findMin
findMin:
fld qword [ebp + 8]
fstp qword [int_var]
fld qword [ebp + 16]
fstp qword [int_var + 8]
fld qword [ebp + 24]
fstp qword [int_var + 16]
fld qword [ebp + 32]
fstp qword [int_var + 24]
我从C代码中调用它,因为C调用约定,float作为64位值传递。所以我每次从堆栈中移动每个参数移动8个字节。 当我输入gdb并打印int_var的值时,我得到了正确的结果:
x/4fw &int_var
如果我写
x/4fg &int_var
我没有将数字传递给函数,但是值不一致。
为什么使用w
字母(32位)正确打印?