補碼、條件跳轉指令

補碼(二進制:正數的補碼爲自己,負數的補碼爲取反加一)
    12進制時鐘:    
        12 + 1 = 13 = 1
        12 - 11 = 1
        這裏的1和-1就互爲補碼
    計算器將減法運算轉換爲加法運算簡化電路
        若是是正數,補碼爲其自己
        若是是負數,補碼即爲摸減去這個數的絕對值
            1 --> 1
            -11 --> 12 - 11 --> 1
            128 - 1 = 128 + (-1的補碼) = 128 + (128 - 1) = 128 + 127 = 127
    取反加一的由來(設爲8位)
        值範圍爲-2^7 ~ 2^7 - 1,模爲 2^7(0111 1111 + 0000 0001)
        值爲x
            2^7 - |x| ==> 0111 1111 - |x|[對x除最高位(最高位爲取絕對值置零了)取反] + 1

8 位二進制數有符號取值範圍爲 -2^7 ~ 2^7 - 1    
    原碼根據是否有符號(最高位是否爲1)則爲 -127 ~ 127 其中0有兩個 1000 0000(-0) 和 0000 0000(+0)
    補碼
        正數(爲原碼)
            +127 0111 1111
            +126 0111 1110
            ...
            +1   0000 0001
            0    0000 0000
        負數(符號位不變,其餘取反加一)    
            -1   1000 0001 --> 1111 1111
            -2   1000 0010 --> 1111 1110
            -3   1000 0011 --> 1111 1101
            ...
            -126 1111 1110 --> 1000 0010
            -127 1111 1111 --> 1000 0001
            -128 XXXX XXXX --> 1000 0000
         那麼-128 的原碼是什麼呢,由補碼求原碼相同 1000 0000 -> 1000 0000(低七位運算時產生溢出,捨去溢出位1)
            XXXX XXXX = -128 = 1000 0000
        這樣就只有一個零了

CF 進位標誌位(0-255)(最高位是否發生變化)
    無符號運算是否發生進位/借位
    255 - 67 = 1111 1111 - 0100 0011 = 10111100    ==> 未發生進位與借位
    67 - 255 = 0100 0100 ==> 最高位發生了借位
    
SF 符號標誌位(-126~127)(即最高位是否爲1)
    最高位是否爲1
    未溢出時
        -1 - (-2) = 1111 1111 + 0000 0010 = (1) 0000 0001    ---> SF = 0, 前者大於後者
        -2 - (-1) = 1111 1110 + 0000 0001 = 1111 1111        ---> SF = 1, 前者小於後者
        
OF 溢出標誌位(結果超出了有符號數所能表示的範圍)
    有符號數運算結果是否發生溢出
    溢出時(負數減正數、正數減負數)
        -3-126 = 1111 1101 + 1000 0010 = 0111 1111 ---> SF = 0, OF = 1 ---> 前者小於後者
        3 - (-126) = 3 + 126 = 129 > 127 ---> SF = 1, OF = 1 ---> 前者大於後者
        -3-125        ---> SF = 1, OF = 0    --->前者小於後者
        3 - (-124)  ---> SF = 0, OF = 0 --->前者大於後者
    
無符號數的比較
    <1 CF = 0 ---> 前者大於等於後者
    <2 CF = 1 ---> 前者小於後者
    
帶符號數比較
    <1 OF = 0, SF = 0 / OF = 1, SF = 1 ---> 前者大於等於後者
    <2 OF = 0, SF = 1 / OF = 1, SF = 0 ---> 前者小於後者
    <3 即 OF⊕SF = 1 ---> 前者小於後者; OF⊙SF = 1 ---> 前者大於等於後者
    
CMP實現兩無符號大小比較時,條件轉移涉及A(Above)、B(Below)、E(Equal), 包括JA(JNBE)、JAE(JNB)、JB(JNAE)、JBE(JNA)
用SUB實現兩個無符號數大小比較時,涉及CF的條件轉移指令JC、JNC

CMP實現兩有符號大小比較時,條件轉移指令涉及G(Greater)、L(Less)、E(Equal), 包括JG(JNLE)、JGE(JNL)、JL(JNGE)、JLE(JNG)
用SUB實現兩有符號大小比較時,涉及SF與OF的條件轉移指令JS、JNS、JO、JNO
    
JMP無條件轉移
    JMP
    指令的相對轉移都是近轉移
    JMP NEAR PTR 標號
    JMP SHORT PTR 標號
    JMP FAR PTR 標號        (段間轉移)
13
84756
相關文章
相關標籤/搜索