C ASM,声明浮点变量
我试图将四个32位浮点变量存储到一个128位浮点变量中,下面是asm代码:C ASM,声明浮点变量,c,assembly,gdb,nasm,C,Assembly,Gdb,Nasm,我试图将四个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 findM
; 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_变量中,使用适当的偏移量
代码不起作用,问题在于fn浮点变量的声明。如果我尝试使用gdb打印它们,我会得到以下结果:
f/fh &fa //print a 32-bit float
0x804a020 <fa>: 0
我从一段C代码中调用它,因为C调用约定,float作为64位值传递。所以我每次从堆栈中移动8个字节。
当我输入gdb并打印int_var的值时,我使用以下方法获得正确的结果:
x/4fw &int_var
如果我写
x/4fg &int_var
我没有得到传递给函数的数字,而是不一致的值。
为什么使用
w
字母(32位)正确打印 fw
格式为单精度浮点(32位),可打印正确的值。您还可以执行p*(float*)和fa
来验证。您没有提供任何关于“代码不工作”的其他提示。@Jester谢谢,如果我写x/4fw&fl\u var
,我会得到0x804a054:1020129
。这是正确的结果。我认为代码不起作用,因为我无法打印正确的结果。你的评论让我意识到为什么我认为fw
是64位双精度浮点。请看我的编辑。正常的C调用约定当然会将浮点作为浮点传递。只有varargs或prototype less函数才会升级为double。因此,如果您在注释中提供了带有浮点数的原型,那么您将得到浮点数而不是双精度浮点数。它工作正常,我可以显示正确的值。我被这个文档愚弄了:参见“堆栈布局”一段。我仍然不明白为什么编辑中的代码使用x/4fw
格式工作
x/4fw &int_var
x/4fg &int_var