为什么x86 assember允许将负整数放入无符号变量中?

时间:2019-02-21 09:44:49

标签: assembly x86

当我在Visual Studios中运行它时,它使我成功地构建了项目。

.data
   val1 DWORD -1

由于DWORD是无符号的,因此输入负值是否会导致错误?

1 个答案:

答案 0 :(得分:4)

一切都只是位模式。例如(NASM语法-dd仅表示“数据双字”),这些值是相同的位模式:

    dd '4321'               ;Interpreted as ASCII characters
    dd 0x31323334           ;Interpreted as an unsigned hexadecimal number
    dd 825373492            ;Interpreted as a signed decimal number

..并且此代码也是完全相同的位模式,只是解释为(32位)指令:

    xor al,0x33
    xor dh,[ecx]

..并且此代码仍然是完全相同的位模式,被解释为16位指令:

    xor al,0x33
    xor dh,[bx+di]

..如果需要,可以将相同的位模式解释为32位浮点数(2.59315147e-9),定点数(例如12594.20001220703125)或二进制编码的十进制数(4321),或者作为颜色(对于RGBA为“暗灰色,带有alpha”),或者作为声音的一部分,或者...

如何创建位模式并不重要。重要的是如何使用位模式。例如,如果您执行add dword eax,[foo]然后jb .somewhere,则分支指令可能表明它是无符号加法,但是如果您执行add dword eax,[foo]然后jl .somewhere,则分支指令可能表明它是已签名的加法(即使加法指令对于已签名和未加法的符号是完全相同的);但是如果您使用fld dword [foo],它将被用作32位浮点值,或者...

现在;如果您看一下2的修饰语的工作方式,您会注意到(对于8位整数,因为我懒于键入32位,所以)有两个范围:

00000000b to 01111111b = 0 to +127, regardless of signed or unsigned
10000000b to 11111111b = +128 to +255 if unsigned, or -128 to -1 if signed

换句话说,对于32位整数,0xFFFFFFFF(无符号)与-1(有符号)具有相同的位模式;并且因为位的模式相同,所以使用哪个版本都没关系(代码可读性除外)。