<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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


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

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

          指令名 :JB
          指令說明 :溢出則跳轉(zhuǎn),什么是溢出呢?當(dāng)計(jì)算(我這里就假設(shè)為是減法計(jì)算了) 結(jié)果超過存放計(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
          指令說明 :和JB指令相反,沒有溢出和跳轉(zhuǎn).... (注意,計(jì)算結(jié)果為0也會(huì)跳轉(zhuǎn)),也就是減法計(jì)算第1個(gè)數(shù)字不低于第2個(gè)數(shù)字的情況下

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

          指令名 :JNA
          指令說明 :溢出或者計(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可以隔開幾行...只要中間沒有會(huì)改變標(biāo)志寄存器的指令(哪些指令會(huì)改標(biāo)志寄存器請(qǐng)自行查詢,一般只有計(jì)算指令才會(huì)改.)

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



          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();