Zero/Sign 不使用 MOVZX/MOVSX 的程序集扩展
Zero/Sign extension in assembly without using MOVZX/MOVSX
我正在尝试进行零或符号扩展,但没有使用 MOVZX
或 MOVSX
。
我基本上想模仿上述命令,但不使用它们。有办法吗?
要从左边添加 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
)。
我正在尝试进行零或符号扩展,但没有使用 MOVZX
或 MOVSX
。
我基本上想模仿上述命令,但不使用它们。有办法吗?
要从左边添加 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
)。