符号收缩如何从 16 位工作到 8 位?
它没有(最高的 8 位,如果值太大而无法放入 8 位,则包括符号位,被简单地丢弃)。
相反,您必须自己实现它。
如果“收缩”是“尽可能多地保留位”,那么它可能会变成这样:
add ax,ax ;carry flag = sign bit, al = lowest 7 bits shifted left
rcr al,1 ;al = original sign bit with original lowest 7 bits
对于您的测试值 0xFF12(或十进制的 -238),在 . 之后变为“设置了进位标志的 0xFE24” add
,然后在 . 之后变为 0x92(或十进制的 -110)rcr
。
更多示例(包括极端案例):
0xFF80 (or -128) -> "0xFF00 with carry flag set" = 0x80 (or -128)
0xFF00 (or -256) -> "0xFE00 with carry flag set" = 0x80 (or -128)
0x0000 -> "0x0000 with carry flag clear" = 0x00
0x007F (or +127) -> "0x00FE with carry flag clear" = 0x007F (or +127)
0x00FF (or +255) -> "0x01FE with carry flag clear" = 0x007F (or +127)
如果“收缩”是“饱和”(钳位值),那么它可能类似于:
mov bx,ax ;bx = original 16-bit value
cbw ;ax = 16-bit extension of original value in AL
cmp ax,bx ;Did the original value fit in 8 bits?
je .done ; yes, AL is correct (no saturation needed)
add bx,bx ;carry flag = original sign bit
mov al,0x7F
adc al,0 ;al = 0x80 (if value was negative) or 0x7F (if value was positive)
.done:
我不确定是否有更好的方法(它看起来很糟糕,我怀疑我的大脑今天不工作)。