|
本帖最后由 jackz007 于 2025-8-19 17:54 编辑
你试试:
- mov ax,1
- mov bx,ax
- mov dx,ax
- inc bx
- sub ax,bx
- sbb dx,0
- int3
复制代码
在这个代码中,设置被减数为 10001H,是一个 32 位数,其高、低 16 位数值均为 1H,被分别对应存放于 dx 和 ax 寄存器,减数为 16 位数值,其数值为 2H,被存放于 bx 寄存器,执行 sub ax,bx 指令,由于 ax < bx,必须要借位,CPU 并不知道从哪里借,于是,指令执行后,只是在 ax 中保存借位后计算结果的低 16 位,同时,置位 CF,表示运算过程有借位发生,这个时候,执行 sbb dx,0,如果 CF 未置位,则执行指令后,dx 寄存器的值不会发生改变,否则,会被减掉数值 1,最后的计算结果应该是 32 位的,高 16 位在 dx 中,低 16 位在 ax 中,其数值为 FFFFH。
同样的道理,你估计 FFFFH + 1H 的结果会是多少?
- xor dx,dx
- mov ax,ffffh
- inc ax
- adc dx,0
- int3
复制代码
这个计算有进位,需要用 adc dx,0 来调整,道理和前面的 sbb 指令一样。其计算结果为 10000H(dx = 1H,ax = 0H)
|
|