汇编代码执行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
相关产品推荐
相关产品推荐

