当我在Visual Studios中运行它时,它使我成功地构建了项目。
.data
val1 DWORD -1
由于DWORD是无符号的,因此输入负值是否会导致错误?
答案 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(有符号)具有相同的位模式;并且因为位的模式相同,所以使用哪个版本都没关系(代码可读性除外)。