新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第14章 有條件跳轉(X86匯編教程)

        第14章 有條件跳轉(X86匯編教程)

        作者: 時間:2016-12-01 來源:網絡 收藏
        X86匯編教程目錄http://www.51hei.com/mcu/2619.html
        一陣瘋狂的游戲后,我又回來了....還記得無條件跳轉嗎?這回我將講解有條件跳轉.
        什么是有條件跳轉呢?那就是,必須達成某某條件才能跳轉,比如說必須數字1和數字2一樣才跳轉,或者數字1比數字2大才跳轉,如果條件沒有實現則不跳轉,相當于跳轉指令不存在.也許你想到了高級語言的IF語句,沒錯,IF語句也是用有條件跳轉實現的.
        判斷的過程是分兩步進行的.先把2個數值運算一下,得出哪個數大哪個小或者是否等于.然后才是有條件跳轉指令
        前邊說過,當我們使用計算指令的時候標志寄存器會隨著計算結果改變,所以,從標志寄存器可以知道上一次計算出來的結果是負數還是正數之類的信息.通過這些信息我們就知道上次計算哪個數字比哪個大(前提是上次計算是使用減法計算),所以,判斷的第一步,運算,一般用減法來做,SUBAX,BX這樣就能根據有條件跳轉指令知道AX和BX哪個大.有時候我們希望進行一次SUB計算,但不希望某個數值被改變,這種時候,就用CMP指令吧.它會進行一次減法運算,只改變寄存器,不保存結果

        指令名 :CMP
        指令說明 :一切用法和SUB減法指令一樣.但是計算后計算結果不會保存下來.只會改變標志寄存器,用來判斷2個數值的大小 就用這個!
        然后有條件跳轉指令,這些指令的使用方法和JMP一樣,所以不詳細介紹,只簡短說明.


        指令名 :JE
        指令說明 :一切用法和JMP跳轉指令一樣,見下邊:
        指令 要跳轉的位置
        與JMP不同的是上次計算結果為0才會跳轉(想想用減法指令計算什么數字結果會為0?)沒錯,這條指令一般是判斷2個數字是否相同用的,一個數字減去自己結果當然為0(當然,沒說一定要這樣,只要上次計算結果是0就能跳轉,自己發揮智力開發其它用途吧).

        指令名 :JNE
        指令說明 :和上個指令相反,上次計算結果不為0就跳轉, 也就是減法計算兩個數字不同的情況下

        指令名 :JB
        指令說明 :溢出則跳轉,什么是溢出呢?當計算(我這里就假設為是減法計算了) 結果超過存放計算結果的寄存器,也就是計算結果為17位,但存放計算結果的寄存器為16位(放不進去)的時候就會溢出(這種情況在加法和乘法中會出現)還有就是計算結果為小于0的數值(負數啊) ,想想減法計算什么情況下會出現負數呢?當然是被減數小于減數的時候.所以這個可以判斷出第一個數字是否比第二個數字小.

        指令名 :JNB
        指令說明 :和JB指令相反,沒有溢出和跳轉.... (注意,計算結果為0也會跳轉),也就是減法計算第1個數字不低于第2個數字的情況下

        指令名 :JA
        指令說明 :上次數學計算(我這里就假設為是減法計算了),結果不是0(那么2個數字不相同)并且沒溢出(那就不可能是負數),也就是被減數比減數大才跳轉

        指令名 :JNA
        指令說明 :溢出或者計算結果相同則跳轉, 也就是減法計算第1個數字不高于第2個數字的情況下(包括2個數字相同喲!)
        實例:
        MOV AX,1000HMOV BX,2000HCMP AX,BX ;CMP指令能虛擬一次減法運算.只改變標志寄存器.JA DaYu ;如果被減數比減數大就跳轉(很顯然跳轉不了啊..)MOV BX,3000HDaYu:CMP BX,AXJA DaYu2 ;如果被減數比減數大就跳轉(這回能跳了)MOV AX,1500HDaYu2:MOV AX,4C00H
        順帶一提,有條件跳轉指令和CMP可以隔開幾行...只要中間沒有會改變標志寄存器的指令(哪些指令會改標志寄存器請自行查詢,一般只有計算指令才會改.)

        作業:寫篇代碼,把所有判斷指令用一次!



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 稻城县| 淮南市| 得荣县| 浮梁县| 水城县| 南昌县| 高要市| 株洲县| 彩票| 大理市| 安图县| 肥西县| 汝南县| 永和县| 满洲里市| 衡阳市| 盱眙县| 包头市| 中宁县| 临潭县| 新龙县| 德清县| 本溪市| 合阳县| 佛坪县| 文登市| 兴和县| 措美县| 京山县| 育儿| 吉林市| 伊宁市| 保定市| 河西区| 京山县| 宜丰县| 苗栗县| 奈曼旗| 浙江省| 肃北| 湘西|