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

汇编代码执行fadd指令报错:Memory operand not allowed in context 求助

解决x87汇编fadd指令的"Memory operand not allowed in context"错误

你的代码有两个关键问题导致了错误:

1. 变量类型定义错误

orderTotal db 0.0里,db是字节类型,只能存储0-255的整数,但0.0是单精度浮点数,需要用dd(32位双字)来定义,才能正确存储浮点数数据。修正后:

orderTotal dd 0.0

2. fadd指令用法不符合x87架构规则

x87浮点指令集的fadd不支持「内存操作数 + 立即整数」的语法,而且整数和浮点数类型不兼容,不能直接相加。正确的做法是通过x87栈来完成浮点数累加,步骤如下:

  • 将orderTotal的当前值加载到栈顶(ST0)
  • 将对应食品的浮点数价格加载到栈顶,或直接与栈顶值相加
  • 将累加后的结果存回orderTotal

修正后的完整代码示例

.code
; 用dd定义单精度浮点数变量,存储订单总价
orderTotal dd 0.0

; 定义各食品的单精度浮点数价格
BurgerPrice dd 10.0
PizzaPrice dd 16.0
ChickenRicePrice dd 8.0

Burger:
    fld dword ptr [orderTotal]   ; 把当前总价加载到x87栈顶(ST0)
    fadd dword ptr [BurgerPrice] ; ST0 = ST0 + 汉堡价格
    fstp dword ptr [orderTotal]  ; 把栈顶的结果存回orderTotal,同时弹出栈顶
    jmp Food

Pizza:
    fld dword ptr [orderTotal]
    fadd dword ptr [PizzaPrice]
    fstp dword ptr [orderTotal]
    jmp Food

ChickenRice:
    fld dword ptr [orderTotal]
    fadd dword ptr [ChickenRicePrice]
    fstp dword ptr [orderTotal]
    jmp Food

简化写法(无需额外价格变量)

如果不想单独定义价格变量,可以直接使用浮点数的十六进制常量(比如10.0的单精度十六进制表示为0x41200000),代码如下:

.code
orderTotal dd 0.0

Burger:
    fld dword ptr [orderTotal]
    fadd dword ptr [dword ptr 0x41200000] ; 直接加10.0的十六进制浮点数
    fstp dword ptr [orderTotal]
    jmp Food

Pizza:
    fld dword ptr [orderTotal]
    fadd dword ptr [dword ptr 0x41300000] ; 16.0的单精度十六进制表示
    fstp dword ptr [orderTotal]
    jmp Food

ChickenRice:
    fld dword ptr [orderTotal]
    fadd dword ptr [dword ptr 0x41000000] ; 8.0的单精度十六进制表示
    fstp dword ptr [orderTotal]
    jmp Food

内容的提问来源于stack exchange,提问作者BrP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:22:46