新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 第14章 有條件跳轉(zhuǎn)(X86匯編教程)

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

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

指令名 :CMP
指令說(shuō)明 :一切用法和SUB減法指令一樣.但是計(jì)算后計(jì)算結(jié)果不會(huì)保存下來(lái).只會(huì)改變標(biāo)志寄存器,用來(lái)判斷2個(gè)數(shù)值的大小 就用這個(gè)!
然后有條件跳轉(zhuǎn)指令,這些指令的使用方法和JMP一樣,所以不詳細(xì)介紹,只簡(jiǎn)短說(shuō)明.


指令名 :JE
指令說(shuō)明 :一切用法和JMP跳轉(zhuǎn)指令一樣,見(jiàn)下邊:
指令 要跳轉(zhuǎn)的位置
與JMP不同的是上次計(jì)算結(jié)果為0才會(huì)跳轉(zhuǎn)(想想用減法指令計(jì)算什么數(shù)字結(jié)果會(huì)為0?)沒(méi)錯(cuò),這條指令一般是判斷2個(gè)數(shù)字是否相同用的,一個(gè)數(shù)字減去自己結(jié)果當(dāng)然為0(當(dāng)然,沒(méi)說(shuō)一定要這樣,只要上次計(jì)算結(jié)果是0就能跳轉(zhuǎn),自己發(fā)揮智力開(kāi)發(fā)其它用途吧).

指令名 :JNE
指令說(shuō)明 :和上個(gè)指令相反,上次計(jì)算結(jié)果不為0就跳轉(zhuǎn), 也就是減法計(jì)算兩個(gè)數(shù)字不同的情況下

指令名 :JB
指令說(shuō)明 :溢出則跳轉(zhuǎn),什么是溢出呢?當(dāng)計(jì)算(我這里就假設(shè)為是減法計(jì)算了) 結(jié)果超過(guò)存放計(jì)算結(jié)果的寄存器,也就是計(jì)算結(jié)果為17位,但存放計(jì)算結(jié)果的寄存器為16位(放不進(jìn)去)的時(shí)候就會(huì)溢出(這種情況在加法和乘法中會(huì)出現(xiàn))還有就是計(jì)算結(jié)果為小于0的數(shù)值(負(fù)數(shù)啊) ,想想減法計(jì)算什么情況下會(huì)出現(xiàn)負(fù)數(shù)呢?當(dāng)然是被減數(shù)小于減數(shù)的時(shí)候.所以這個(gè)可以判斷出第一個(gè)數(shù)字是否比第二個(gè)數(shù)字小.

指令名 :JNB
指令說(shuō)明 :和JB指令相反,沒(méi)有溢出和跳轉(zhuǎn).... (注意,計(jì)算結(jié)果為0也會(huì)跳轉(zhuǎn)),也就是減法計(jì)算第1個(gè)數(shù)字不低于第2個(gè)數(shù)字的情況下

指令名 :JA
指令說(shuō)明 :上次數(shù)學(xué)計(jì)算(我這里就假設(shè)為是減法計(jì)算了),結(jié)果不是0(那么2個(gè)數(shù)字不相同)并且沒(méi)溢出(那就不可能是負(fù)數(shù)),也就是被減數(shù)比減數(shù)大才跳轉(zhuǎn)

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

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



評(píng)論


技術(shù)專區(qū)

關(guān)閉