2

我正在尝试进行零或符号扩展,但不使用MOVZXor MOVSX
我基本上想模仿上述命令,但不使用它们。有没有办法做到这一点?
要从左侧添加 0,SHR但我不太确定它是否可以正常工作,因为它会更改值...

我正在使用大会 8086

4

1 回答 1

3

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

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

  • 执行 anAND以获取要扩展的单词的最高位
  • 将结果从原始值中减去两次,或者:
  • 将结果左移一位并从原始值中减去一次

示例: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

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

于 2020-11-18T12:14:20.627 回答