You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将EAX/RAX寄存器中的整数传入FPU寄存器st0?(NASM语法)

将整数从EAX/RAX传入FPU st0的NASM实现方案

当然可以!在x86汇编(NASM语法)环境下,把通用寄存器EAX(32位)或RAX(64位)里的整数标量传入FPU的st0寄存器,有几种简单直接的实现方式,我分两种位数环境给你详细说明:

32位环境(EAX → st0)

最常用的是通过栈中转,或者用临时内存变量过渡,核心指令是fild——它会把内存中的整数自动转换为FPU的80位扩展精度浮点格式,并加载到st0寄存器。

栈中转示例

section .text
global _start

_start:
    mov eax, 12345          ; 给EAX赋值目标整数
    push eax                ; 将EAX的值压入栈中
    fild dword [esp]        ; 从栈顶加载32位整数到st0(自动转浮点)
    add esp, 4              ; 平衡栈指针,避免栈泄漏

    ; 此时st0中已存储12345的浮点表示,可执行后续FPU操作
    ; 例如:fstp dword [result] 将st0的值存回内存

    ; 退出程序
    mov eax, 1
    xor ebx, ebx
    int 0x80

内存变量中转示例

如果不想用栈操作,也可以定义一个临时内存变量:

section .bss
    temp_dword resd 1       ; 定义一个32位内存变量

section .text
global _start

_start:
    mov eax, 6789
    mov [temp_dword], eax   ; 把EAX的值存入内存变量
    fild dword [temp_dword] ; 从内存加载整数到st0

    ; 后续操作...

64位环境(RAX → st0)

64位环境下逻辑类似,只是要处理64位整数,使用qword类型的操作数:

栈中转示例

section .text
global _start

_start:
    mov rax, 6789012345     ; 给RAX赋值64位整数
    push rax                ; 将RAX的值压栈
    fild qword [rsp]        ; 从栈顶加载64位整数到st0(自动转浮点)
    add rsp, 8              ; 平衡栈指针

    ; st0中已存储目标整数的浮点表示,可执行后续FPU操作

    ; 退出程序
    mov rax, 60
    xor rdi, rdi
    syscall

内存变量中转示例

section .bss
    temp_qword resq 1       ; 定义一个64位内存变量

section .text
global _start

_start:
    mov rax, 1234567890123
    mov [temp_qword], rax   ; 把RAX的值存入内存变量
    fild qword [temp_qword] ; 从内存加载整数到st0

    ; 后续操作...

关键说明

  • fild是核心指令:它会自动完成整数到FPU扩展精度浮点的转换,不需要手动处理格式转换。
  • 栈操作后必须平衡栈:32位下压栈4字节,要加add esp,4;64位下压栈8字节,要加add rsp,8,否则会导致栈异常。
  • 两种中转方式的选择:栈中转更节省内存(不需要额外定义变量),内存中转则更直观,适合复杂场景下的调试。

内容的提问来源于stack exchange,提问作者J.B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:22:18