首先要知道一个概念,就是带符号的数如8位二进制的表示范围为 -128~127
-128的补码与128的补码是一样的。(对于零界的-xxx对应的xxx的补码都是一样的)
16位二进制的补码表示数的范围
-32768D | +32767
(8000H) | (7FFFH)
|
(-------> | <-------)
负数 ---负溢出---|-> 正数
|
<--|正溢出----
------ | ------
-1D | +1D
(FFFFH) | (0001H)
如此:对于要求<的JL指令(检测带符号数的),他的测试条件为 : SF异或OF = 1;
则可用上面的图证明出:
如: MOV AX,A
CMP A,B
JL X
//(A)=a ; (B)=b;
①:当a>b时
a=0101h, b=1100h,
a-b=1001 (溢出)
此时,SF =1, OF = 1;表明是正溢出,结果自然就是错误的。
这样的话,与JL的测试条件不符。
②:当a>=b时(未溢出的例子)
SF = 0, OF = 0,这样的话 与JL的测试条件不符
③:当a<b时 ,
a=1100h , b=0101h
a-b=0111h(溢出)
此时,SF=0 , OF = 1;
可见,与JL的测试条件相符
④:当a<b时,(这个是未溢出的例子)
未溢出,则SF =1, OF =0;
可见,与JL的测试条件相符。
通过分析可知,JL的测试条件SF异或OF = 1;可检测无论是否溢出时的a<b,即检测<