Zero/Sign 不使用 MOVZX/MOVSX 的程序集扩展

Zero/Sign extension in assembly without using MOVZX/MOVSX

我正在尝试进行零或符号扩展,但没有使用 MOVZXMOVSX
我基本上想模仿上述命令,但不使用它们。有办法吗?
要从左边添加 0,有 SHR 但我不太确定它是否相同,因为它改变了值...

我正在使用 8086 组件

所有 x86-16 CPUs 提供 CBW(8 位到 16 位)和 CWD(16 位到 32 位)指令。

如果您想进行“通用”符号扩展(例如,从 12 位到 16 位而不是从 8 位到 16 位),您可以使用以下适用于任何 CPU:

  • 执行一次AND得到要扩展的字的最高位
  • 将结果从原始值中减去两次或:
  • 将结果左移一位并从原始值中减去一次

示例:符号扩展 AX 从 12 位到 16 位:

; Ensure that the value is really a 12-bit value
AND AX, 0xFFF
; Extract the highest bit
MOV CX, AX
AND CX, 0x800
; Subtract that value twice
SUB AX, CX
SUB AX, CX

上面的代码可以通过仅处理 AX 的高字节来简化(例如 AND AH, 0xF 而不是 AND AX, 0xFFF)。