assembly - movsx 是否暗示了目的地的签名?
问题描述
从这个问题:
movzx ecx, 人; 将字节移动到双字,零扩展
如果您希望将 al 中的值视为已签名,还有 MOVSX。
上面提到了“movsx”意味着 al 已签名。
- 是否
movzx
意味着al
未签名? movsx
(如果有的话)的签名意味着什么ecx
?movzx
(如果有的话)的签名意味着什么ecx
?
解决方案
寄存器本身没有签名。movsx
表示“为目标分配一个值,该值(被视为已签名)将等于源的值(被视为已签名)”。相同movzx
,用无符号代替有符号。因此,如果您使用 sx 它就好像源和目标都已签名,而 zx则好像两者都未签名。例子:
let al = 0xFF = (signed) -1 = (unsigned) 255 (the same number, all bits set)
after movsx ecx, al, all bits will be set:
ecx = 0xFFFFFFFF = (signed) -1 = (unsigned) 4294967295
after movzx ecx, al, only lower 8 bits will be set:
ecx = 0x000000FF = (signed) 255 = (unsigned) 255
请注意,对于较小的寄存器al
编号 -1 和 255 由同一组位表示,但对于较大的寄存器,ecx
这两个相同的编号具有不同的位表示。
编辑:正如 Jester 所指出的,使用movzx
并不意味着目的地的有符号性,因为movzx
目的地的最高位始终为 0,因此在被视为有符号和无符号时它具有相同的值。
推荐阅读
- ansible - 在 easy_install 中被 ansible 提示输入 ssh 密码
- java - 我正在通过循环方法查找数字的阶乘,但是当我尝试运行代码时,出现错误,因为“我”无法在变量中解析
- android - onOptionsItemSelected 在片段中不起作用
- c# - 缺少与我当前的正则表达式的第一个匹配
- algorithm - 如何在 O(nlogn) 时间内找到两组的所有和(算术和比较)
- c# - 我们如何在 c#.Net 控制台创建新字符?
- flutter - Listview 构建器区域上的“NoSuchMethodError:getter 'length' 被调用为 null”
- python-3.x - 收到错误为“AttributeError:'NoneType'对象没有属性'to_csv'”
- firefox - MOZILLA_PKIX_ERROR_MITM_DETECTED?
- php - Laravel Voyager 菜单未更新