Assembly 在使用IMUL r/m8指令时,为什么在这种情况下设置OF和CF标志

Assembly 在使用IMUL r/m8指令时,为什么在这种情况下设置OF和CF标志,assembly,x86,flags,carryflag,Assembly,X86,Flags,Carryflag,使用带有单个8位操作数的IMUL指令时,结果存储在AX寄存器中。 我有以下代码 mov eax, 0 mov ebx, 0 mov al, 48 mov bl, 4 call dumpregs imul bl call dumpregs 48*8是192(十六进制中的C0),它被正确地存储在AX寄存器中,作为00C0(参见下面的输出)。AX寄存器的有符号范围为-32768到+32767,无符号范围为0到65535。因此,OF和CF

使用带有单个8位操作数的IMUL指令时,结果存储在AX寄存器中。 我有以下代码

    mov eax, 0
    mov ebx, 0

    mov al, 48
    mov bl, 4

    call dumpregs

    imul bl

    call dumpregs
48*8是192(十六进制中的C0),它被正确地存储在AX寄存器中,作为00C0(参见下面的输出)。AX寄存器的有符号范围为-32768到+32767,无符号范围为0到65535。因此,OF和CF标志都应清除(0)。但正如您在下面的输出中所看到的,它们都被设置为(1)


根据“当中间乘积的带符号整数值与带符号扩展操作数大小截断乘积不同时,设置CF和OF标志,否则清除CF和OF标志。”逻辑是,结果将始终适合双大小目标,因此使用标志将毫无意义。这样,标志会告诉您是否可以安全地将结果截断为原始源操作数大小,在本例中为8位。由于192不适合有符号8位,因此设置了标志。换言之,它溢出了8位大小,因此您需要使用生成的完整16位输出。好的,设置OF是因为192不适合有符号8位。但是,为什么设置CF?我知道CF是在无符号值超出范围时设置的,但对于8位255,它是最大范围,192在该范围下,因此CF应该是清楚的,但事实并非如此,正如@Paulrbecase提到的文档中所指定的那样,±CF和of in乘法运算总是并行设置/重置。该逻辑仅涉及算术运算(加法、sub)。进位标志并不表示其他指令(如移位、旋转、乘法)中的无符号溢出。根据“当中间乘积的有符号整数值不同于符号扩展操作数大小截断乘积时,设置CF和OF标志,否则清除CF和OF标志。”逻辑是,结果将始终适合双大小的目的地,因此为其使用标志将是毫无意义的。这样,标志会告诉您是否可以安全地将结果截断为原始源操作数大小,在本例中为8位。由于192不适合有符号8位,因此设置了标志。换言之,它溢出了8位大小,因此您需要使用生成的完整16位输出。好的,设置OF是因为192不适合有符号8位。但是,为什么设置CF?我知道CF是在无符号值超出范围时设置的,但对于8位255,它是最大范围,192在该范围下,因此CF应该是清楚的,但事实并非如此,正如@Paulrbecase提到的文档中所指定的那样,±CF和of in乘法运算总是并行设置/重置。该逻辑仅涉及算术运算(加法、sub)。进位标志并不意味着其他指令(如移位、旋转、乘法)中存在无符号溢出。