0B4H-63H为什么会发生负溢出
时间: 2023-07-05 17:07:29 浏览: 35
0B4H是十六进制数,换算成十进制是180。在8位二进制数中,0B4H是00001011 0100,最高位是0表示这是一个正数。如果在计算机中处理该数时,使用了一个只能存储0-255之间的无符号8位整数的变量,那么当将0B4H赋值给该变量时,会发生溢出。因为0B4H超出了该变量可以存储的最大值255,所以只会保留最后8位0100,即十进制的4。由于最高位变成了1,所以此时的值是负数,即-252。因此会发生负溢出。
相关问题
例5-29分析有符号数0400H除以0B4H的程序片段。
这道题目需要注意两个点:
1. 0400H 是一个有符号数,因此需要将它转换为补码形式。
2. 除法指令 `div` 的操作数必须是无符号数,因此需要将除数 0B4H 也转换为无符号数。
下面是程序片段:
```
mov ax, 0400H ; 将有符号数 0400H 转换为补码形式
cbw ; 将 AL 的符号位扩展到 AH 中
mov bx, 0B4H ; 将除数存储在 BX 中
div bx ; 执行除法,商存储在 AL 中,余数存储在 AH 中
```
首先将有符号数 0400H 转换为补码形式。由于最高位是 0,因此补码和原码相同,即补码为 0400H。
接着使用 `cbw` 指令将 AL 中的符号位扩展到 AH 中。由于 AL 的最高位是 0,因此 AH 中也填充了 0。
将除数 0B4H 存储在 BX 中。
执行 `div bx` 指令,此时 AX 中的值为 0400H,BX 中的值为 0B4H。由于除法指令 `div` 只能处理无符号数,因此需要将除数 0B4H 转换为无符号数。0B4H 的无符号表示为 180,因此除法的实际操作数为 180。
执行除法操作后,商存储在 AL 中,余数存储在 AH 中。此时 AL 的值为 2,AH 的值为 68H(104)。因此,有符号数 0400H 除以有符号数 0B4H 的商为 2,余数为 104。
执行mov ax,017ch add ai,0b4h后AX寄存器的值
执行指令mov ax, 017ch,将立即数017c(十进制数为380)传送给AX寄存器,使得AX寄存器的值为380。
执行指令add ax, 0b4h,将立即数0b4(十进制数为180)加到AX寄存器中,AX寄存器的值将会变为560(380+180)。
因此,执行完这两条指令后,AX寄存器的值为560。