这里是说明:
mov eax,42ae0000r
MASM没有给出错误,但是创建的代码是这样的:
00000000 B8 19B6A492 mov eax,42ae0000r
从文档中可以看出,“ r”后缀用于浮点十六进制值。如果使用该值作为初始化程序,则此结果与得到的结果不同,如下所示:
mytest4 real4 7d998000r
创建的代码是这样:
0000001B 7D998000 mytest4 real4 7d998000r
您可以看到结果有所不同。
对我来说,这感觉就像是解析器中的错误。也就是说,汇编程序本应生成错误,但由于某种原因不会生成错误,而是最终以奇怪的方式解析这些数字。
这与说行为未定义不同。结果似乎是完全可以预测的。
让我们看一些基本示例:
mov ebx,0r
mov eax,1r
mov eax,2r
mov eax,10r
此组合成:
00000405 BB52000000 mov ebx,0x52
0000040A B85C000000 mov eax,0x5c
0000040F B866000000 mov eax,0x66
00000414 B8B6000000 mov eax,0xb6
因此我们可以看到0r
等于0x52。这实际上是字母R(其ASCII码)。
[如果我们查看其他行,则会看到一个模式:生成的值始终为'R'
加上R之前的值乘以10。因此1r
== 'R' + 1*10
,2r
== 'R' + 2*10
,等等。如果该值变得大于目的地(在这种情况下为32位),则将其截短为该大小。
这些数字的基数有点奇怪,因为允许使用十六进制数字(0..F),但是每个数字仅比其右边的数字大10倍。因此,11r
和0Br
得出的值完全相同(0xC0
)。