首页 > 解决方案 > movsx 是否暗示了目的地的签名?

问题描述

从这个问题

movzx ecx, 人; 将字节移动到双字,零扩展

如果您希望将 al 中的值视为已签名,还有 MOVSX。

上面提到了“movsx”意味着 al 已签名。

  1. 是否movzx意味着al签名
  2. movsx(如果有的话)的签名意味着什么ecx
  3. movzx(如果有的话)的签名意味着什么ecx

标签: assemblyx86unsignedsignedsign-extension

解决方案


寄存器本身没有签名。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,因此在被视为有符号和无符号时它具有相同的值。


推荐阅读