NASM编译fst tword [mem]报错是否属于软件Bug?
这不是NASM的Bug,而是遵循x86指令集规范的正常行为
其实这并不是NASM的bug,而是它严格按照x86浮点单元(FPU)的指令集规则工作的正常表现。
具体来说,x86指令集对fst和fstp的操作数支持范围有明确的区分:
fst指令的设计目标是复制FPU栈顶的值,它仅支持将值写入32位单精度(dword)内存、64位双精度(qword)内存,或者另一个FPU寄存器。从指令集定义上,它就不支持写入80位扩展精度(tword)的内存地址——根本没有对应的机器码来实现这个操作。fstp指令则是复制并弹出FPU栈顶的值,它在fst的基础上额外支持写入80位扩展精度(tword)内存,这是指令集本身赋予它的功能,和汇编器无关。
NASM在这里报错是完全正确的:它检测到你试图使用fst搭配tword内存操作数,而这种组合在x86指令集中是不存在的,所以拒绝生成无效的机器码。你可以去查Intel或AMD的官方x86指令集手册,里面会明确标注fst的内存操作数仅支持dword和qword类型,而tword仅对fstp开放支持。
内容的提问来源于stack exchange,提问作者Mayer Goldberg
相关产品推荐
相关产品推荐

