首页 > 解决方案 > 为什么 x86 汇编器允许将负整数放入无符号变量中?

问题描述

当我在 Visual Studios 中运行它时,它可以让我成功构建项目。

.data
   val1 DWORD -1

由于 DWORD 是无符号的,输入负值不应该导致错误吗?

标签: assemblyx86

解决方案


一切都只是位的模式。例如(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(有符号)的位模式相同;并且由于位模式相同,因此您使用哪个版本都没有关系(代码可读性除外)。


推荐阅读