使用MASM时,我找不到有关如何以浮点十六进制格式设置值的信息。例如:什么是50.1的十进制值等于使用“ r”后缀?
也根据我拥有的MASM文档:
浮点值不能是立即值。如果真是这样,则以下以下说明在MASM中应该是错误的,但MASM可以正确地组装它们:
mov eax,1r ;What is "1r" = in decimal
mov eax,42ae0000r
MASM如下组装它们:
B8 0000005C mov eax,1r
B8 19B6A492 mov eax,42ae0000r
也来自测试:
以下说明的汇编时:
mov eax,1.2r
MASM给出此错误:
error A2050: real or BCD number not allowed
后缀为“ r”的值不能带有“。”在里面。如果使用“ r”后缀。这是正确的吗?
在此示例中,如果允许一个值是立即数并且后缀为“ r”,并且不带逗号,则该值不是十六进制浮点值。那是什么?
r
后缀将值标记为实数常量。但是,MASM期望带有此后缀的实数常量为十六进制格式,而不是十进制格式。例如,3F800000r
是作为IEEE 4字节浮点数(REAL4
)的值1.0,并且3FF0000000000000r
是作为IEEE 8字节浮点数[REAL8
)的值1.0。
如果要用十进制表示数字,则不需要r
后缀。小数点将向汇编器指示它是一个实数常数。例如,1.0
,3.1415
或3141.5E-3
。
查看您的代码,1r
被解释为值1543503872
。您可以从反汇编中得知:
B8 0000005C mov eax,1r
B8
是将MOV
作为目标寄存器的EAX
指令的编码。其余字节(0000005C
)是源操作数,使用小尾数表示法以十六进制格式编码。0x5C000000
==1,543,503,872
。
相同于:
B8 19B6A492 mov eax,42ae0000r
这里,源操作数是小尾数十六进制常量
0x92a4b619
或十进制2,460,268,057
。
说明:
mov eax,1.2r
由于上述原因,被正确拒绝。