从这个问题:
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,因此在被视为有符号和无符号时它具有相同的值。