![]() | 第4章 奇妙的声音 | -73- | |||||||||||||||||||
-t | |||||||||||||||||||||
AX=0100 | BX=0100 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13CD | ES=13CD | SS=13CD | CS=13CD | IP=010A | NV UP EI PL NZ NA PE NC | ||||||||||||||||
13CD:010A | 29D8 | SUB AX,BX | 大的数减小的数没有产生借位 | ||||||||||||||||||
最后一个SUB指令反映了相等的两个数相减时ZF标志位的变化情况,此情况前文已有所讨论。 | |||||||||||||||||||||
-t | |||||||||||||||||||||
AX=0000 | BX=0100 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13CD | ES=13CD | SS=13CD | CS=13CD | IP=010C | NV UP EI PL ZR NA PE NC | ||||||||||||||||
13CD:010C | 745B | JZ 0169 | 相等两个数相减ZF标志发生变化 | ||||||||||||||||||
通过以上跟踪结果可以清楚地看到当用100H和200H相比较时(CPU实际执行100H-200H)CF标志置位,NC变为CY。这说明小的无符号数减大的无符号数时只有CF置位,因此JB指令的转移条件是CF=1;当我们用200H减去100H时,可以看到CF标志复位(置零)。好象这里面没有ZF的事,指令JA只需判断CF的状态就成了,其实不然。请看当用100H-100H时CF仍置零,而ZF却置成了1。可见如果仅判断CF标志,那么无论是"高于"(Above)还是"为零"(Zero)指令都要完成转移,这显然不是JA指令的含义。 那么我们为什么说这两条指令仅用于相同符号的数呢?解决这个问题我们还得靠DEBUG来帮忙: |
|||||||||||||||||||||
C:\ASM\>DEBUG[Enter] | |||||||||||||||||||||
-a[Enter] 13CD:0100 13CD:0103 13CD:0106 13CD:0108 13CD:010A |
mov ax,-1 mov bx,1 cmp ax,bx ja 120 |
||||||||||||||||||||
-r | |||||||||||||||||||||
AX=0000 | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13CD | ES=13CD | SS=13CD | CS=13CD | IP=0100 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
13CD:0100 | B8FFFF | MOV AX,FFFF | 注意-1的补码表示 | ||||||||||||||||||
-1的补码为0FFFFH,但这个数如果作为无符号数它又是"+65535",CPU究竟如何处理这个数呢? | |||||||||||||||||||||
-t | |||||||||||||||||||||
AX=FFFF | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13CD | ES=13CD | SS=13CD | CS=13CD | IP=0103 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
13CD:0103 | BB0100 | MOV BX,0001 | 设置BX寄存器为1 | ||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |