这是MASM中的有效指令

问题描述 投票:0回答:1

这里是说明:

    mov eax,42ae0000r

MASM没有给出错误,但是创建的代码是这样的:

    00000000  B8 19B6A492       mov eax,42ae0000r

从文档中可以看出,“ r”后缀用于浮点十六进制值。如果使用该值作为初始化程序,则此结果与得到的结果不同,如下所示:

    mytest4 real4 7d998000r

创建的代码是这样:

    0000001B 7D998000       mytest4 real4 7d998000r

您可以看到结果有所不同。

masm masm32
1个回答
0
投票

对我来说,这感觉就像是解析器中的错误。也就是说,汇编程序本应生成错误,但由于某种原因不会生成错误,而是最终以奇怪的方式解析这些数字。


这与说行为未定义不同。结果似乎是完全可以预测的。

让我们看一些基本示例:

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*102r == 'R' + 2*10,等等。如果该值变得大于目的地(在这种情况下为32位),则将其截短为该大小。

这些数字的基数有点奇怪,因为允许使用十六进制数字(0..F),但是每个数字仅比其右边的数字大10倍。因此,11r0Br得出的值完全相同(0xC0)。

© www.soinside.com 2019 - 2024. All rights reserved.