assembly - 为什么 x86 汇编器允许将负整数放入无符号变量中?
问题描述
当我在 Visual Studios 中运行它时,它可以让我成功构建项目。
.data
val1 DWORD -1
由于 DWORD 是无符号的,输入负值不应该导致错误吗?
解决方案
一切都只是位的模式。例如(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(有符号)的位模式相同;并且由于位模式相同,因此您使用哪个版本都没有关系(代码可读性除外)。
推荐阅读
- loops - 气流任务仅在外部触发时运行一次,而不是在默认争论中提到的时间间隔中指定
- angular - Angular 8 测试 - Devextreme Grid getDataSource() 不使用状态存储
- regex - grep 和正则表达式 (regex)
- spring-boot - 与团队管理相同的微服务
- java - 已被 CORS 策略阻止:对预检请求的响应未通过
- python-2.7 - python 捕获的异常堆栈跟踪与未捕获的异常堆栈跟踪
- plotnine - 无法导入plotnine
- ios - 如何在swift中将json对象一一写入json对象
- ios - 在 iOS 上点击推送通知时,Ionic 4 不会打开目标页面
- typescript - 如何在 typescript 的接口或 ovject 文字类型中使某些属性需要但都允许?