为什么FASM在`use16`指令下可成功汇编含32位有效地址的代码?
问题解答
你理解的“16位寻址模式下不允许用32位地址”是个常见误区,实际原因如下:
USE16只是告诉FASM当前代码默认运行在16位模式下,指令默认使用16位地址宽度、16位操作数宽度,并不禁止使用32位寄存器相关的寻址方式。- 80386及以上的x86 CPU在16位模式下,本身就支持通过
0x67地址大小前缀切换单次指令的地址宽度为32位。当你在16位代码里显式使用ECX这种32位寄存器做寻址时,FASM会自动在生成的机器码前加上0x67前缀,让CPU识别这是32位寻址的指令,完全符合x86指令集规范,自然可以汇编通过。 - 你提到的汇编结果显示这条指令占7字节,其中就包含了自动添加的地址前缀,你可以导出机器码验证,第一个字节就是
0x67。
注意:这种指令虽然能正常汇编运行,但16位实模式下有地址总线宽度限制(未开启A20的情况下只有20位),如果ECX的值超出合法的16位地址范围,会触发地址回卷或者异常,实际使用时需要注意边界。
内容的提问来源于stack exchange,提问作者iEPCBM
相关产品推荐
相关产品推荐

