ASM,声明浮点变量

时间:2015-06-08 19:32:26

标签: 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

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位)正确打印?

0 个答案:

没有答案