您想将 to 的内容移动CH
到CX
8086 上。
在更新的处理器上,例如 80286,您可以将CX
right 的值移动 8 个位置,有或没有符号复制:
; zero extend ch into cx
shr cx,8
; sign extend ch into cx
sar cx,8
这些指令在 8088 或 8086 上不可用。您必须使用CL
来指定移位计数:
; zero extend ch into cx
mov cl,8
shr cx,cl
; sign extend ch into cx
mov cl,8
sar cx,cl
然而,这种方法非常慢,因为可变数量的位置移位每个位置需要多个周期。
这是一个更快的方法:
; zero extend ch into cx
mov cl,ch
xor ch,ch
; sign extend ch into cx
mov cl,ch
neg ch ; set the carry flag if ch is negative
sbb ch,ch ; set all bits if ch was negative, clear them otherwise
如果您可以销毁 AX,则可以使用cbw
为此设计的代码来节省代码大小。在原始 8086 尤其是 8088 上,小 = 快,因为代码获取是一个主要瓶颈。但是,在现代 x86 上并非如此。
; sign extend ch into ax
mov al, ch
cbw ; sign-extend AL into AX
; optionally move back to cx
xchg cx, ax ; smaller than mov cx, ax
为避免破坏 AX,您可以这样做mov cl,ch
;xchg ax,cx
; cbw
并停在那里,或者做一个决赛xchg ax,cx
,只是将 CH 符号扩展到 CX 并恢复其他所有内容。 xchg
with AX 是一个 1 字节指令,and 也是cbw
(cwd
将 AX 扩展到 DX:AX,例如在 16-bit 之前idiv
)
cbw
与 386 完全相同movsx ax, al
。