C 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

我试图将四个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_变量中,使用适当的偏移量

代码不起作用,问题在于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