Assembly 汇编语言:cbw

Assembly 汇编语言:cbw,assembly,x86,division,sign-extension,Assembly,X86,Division,Sign Extension,我不确定cbw命令的实际功能。我有一段代码: mov ax,0FF0h cbw idiv ah cbw后ax值如何变化?cbw指令符号将一个字节扩展为一个字。在这种情况下,它将取AL(正好是1)的符号位,并将其复制到AH的每个位 这意味着AX的两个补数值将相同,但二进制表示形式将不同 cbw指令之后的AX值将是FFF0h(一个16位-16值,就像AL最初是一个8位-16)谢谢。我理解你对AL的符号位为1的解释,因为它是负数,但我有点困惑为什么AL最初是8位-1。原来是不是AL-16(符号位等

我不确定
cbw
命令的实际功能。我有一段代码:

mov  ax,0FF0h
cbw
idiv ah

cbw后ax值如何变化?

cbw指令符号将一个字节扩展为一个字。在这种情况下,它将取
AL
(正好是1)的符号位,并将其复制到
AH
的每个位

这意味着
AX
的两个补数值将相同,但二进制表示形式将不同


cbw
指令之后的
AX
值将是
FFF0h
(一个16位-16值,就像
AL
最初是一个8位-16)

谢谢。我理解你对
AL
的符号位为1的解释,因为它是负数,但我有点困惑为什么
AL
最初是8位-1。原来是不是
AL
-16(符号位等于1)?0FF0h中的最后一个零被忽略了。AX应在CBW之后变为0FFF0h。请在英特尔或AMD的ISA参考手册的任何副本中查找它:。英特尔和AT&T语法的cbw/cwde/cwd/etc.等价物表,请参见。扩展到AX的符号后除以
AH
,异常奇怪。对于非负AL,它将出错(因为AH=0),或者对于负AL,它将除以
-1
。(对于AL=80h,再次使用
#DE
出错,因为-128/-1=+128溢出8位AL。)这就像是获取AL绝对值的最糟糕、最低效的尝试。