日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于汇编跳转指令的说明

發(fā)布時(shí)間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于汇编跳转指令的说明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
雖然jmp指令提供了控制轉(zhuǎn)移,但是它不允許進(jìn)行任何復(fù)雜的判斷。80x86條件跳轉(zhuǎn)指令提供了這種判斷。條件跳轉(zhuǎn)指令是創(chuàng)建循環(huán)和實(shí)現(xiàn)其他條件執(zhí)行語(yǔ)句,如if…endif的基本要素。 條件跳轉(zhuǎn)指令檢查一個(gè)或多個(gè)標(biāo)志位,判斷它們是否匹配某個(gè)特殊條件(就像setcc指令):如果標(biāo)志匹配成功,該指令就將控制轉(zhuǎn)移到目標(biāo)位置;如果匹配失敗,CPU忽略該條件跳轉(zhuǎn)指令而繼續(xù)執(zhí)行下一條指令。一些條件跳轉(zhuǎn)指令只是簡(jiǎn)單測(cè)試符號(hào)位(sign)、進(jìn)位位(carry)、溢出位(overflow)、零標(biāo)志(zero)位的設(shè)置。例如,在執(zhí)行一條sh1指令后,您需要測(cè)試進(jìn)位標(biāo)志,來(lái)判斷sh1是否從操作數(shù)的高地址位移出一位。類似地,也可以在一條test指令后測(cè)試零標(biāo)志位,來(lái)判斷指定的位是否為1。大多數(shù)情況,在cmp指令之后執(zhí)行條件跳轉(zhuǎn)指令。cmp指令設(shè)置標(biāo)志位,以便判斷小于、大于、等于等情況。 條件跳轉(zhuǎn)指令形式如下: Jcc label; 其中,Jcc中的“cc”,必須用表示測(cè)試條件類型的字符序列替換。這些字符和setcc指令使用的一樣。例如,“js”表示根據(jù)符號(hào)(sign)標(biāo)志是否被置位來(lái)決定是否跳轉(zhuǎn)。一個(gè)典型的js指令如下: js ValueIsNegative ; 在這個(gè)示例中,如果符號(hào)(sign)標(biāo)志被置位,則js指令將控制轉(zhuǎn)移到ValueIsNegative語(yǔ)句標(biāo)號(hào)處;如果符號(hào)標(biāo)志清零,則將控制直接轉(zhuǎn)移給js指令后的指令。 與無(wú)條件jmp指令不同,條件跳轉(zhuǎn)指令不提供間接跳轉(zhuǎn)的形式。惟一允許的形式是跳轉(zhuǎn)到程序中某一標(biāo)號(hào)處。條件跳轉(zhuǎn)指令有一個(gè)限制:目標(biāo)標(biāo)號(hào)的位置必須在跳轉(zhuǎn)指令本身附近32768字節(jié)范圍內(nèi),這通常對(duì)應(yīng)著8000~32000條機(jī)器指令。一般情況下不會(huì)超過(guò)這種限制。 注意:Intel文檔為許多條件跳轉(zhuǎn)指令定義了多種替代名或指令別名。表7-1、7-2和7-3列出了每個(gè)指令所有的別名。這些表格也列出了表示相反分支的指令。很快您將明白這些相反分支指令的作用。 表7-1 測(cè)試標(biāo)志位的JCC指令
指 令 描 述 條 件 別 名 相 反 指 令
JC 如果進(jìn)位位被置位則跳轉(zhuǎn) 進(jìn)位標(biāo)志=1 JB,JNAE JNC
JNC 如果進(jìn)位位沒(méi)有置位則跳轉(zhuǎn) 進(jìn)位標(biāo)志=0 JNB,JAE JC
JZ 如果0標(biāo)志被置位則跳轉(zhuǎn) 0標(biāo)志=1 JE JNZ
JNZ 如果0標(biāo)志沒(méi)有置位則跳轉(zhuǎn) 0標(biāo)志=0 JNE JZ
(續(xù)表)
指 令 描 述 條 件 別 名 相反指令
JS 如果符號(hào)位被置位則跳轉(zhuǎn) 符號(hào)標(biāo)志=1 JNS
JNS 如果符號(hào)位沒(méi)有被置位則跳轉(zhuǎn) 符號(hào)標(biāo)志=0 JS
JO 如果溢出標(biāo)志置位則跳轉(zhuǎn) 溢出標(biāo)志=1 JNO
JNO 如果溢出標(biāo)志沒(méi)有置位則跳轉(zhuǎn) 溢出標(biāo)志=0 JO
JP 如果奇偶校驗(yàn)位被置位則跳轉(zhuǎn) 奇偶校驗(yàn)標(biāo)志=1 JPE JNP
JPE 如果奇偶校驗(yàn)位為偶校驗(yàn)則跳轉(zhuǎn) 奇偶校驗(yàn)標(biāo)志=1 JP JPO
JNP 如果奇偶校驗(yàn)位沒(méi)有被置位則跳轉(zhuǎn) 奇偶校驗(yàn)標(biāo)志=0 JPO JP
JPO 如果奇偶校驗(yàn)位為奇校驗(yàn)則跳轉(zhuǎn) 奇偶校驗(yàn)標(biāo)志=0 JNP JPE
表7-2 使用無(wú)符號(hào)數(shù)比較的JCC指令
指 令 描 述 條 件 別 名 相反指令
JA 如果超過(guò)(>)則跳轉(zhuǎn) 進(jìn)位標(biāo)志=0,0標(biāo)志=0 JNBE JNA
JNBE 如果不低于或等于(不 <=)則跳轉(zhuǎn) 進(jìn)位標(biāo)志=0,0標(biāo)志=0 JA JBE
JAE 如果超過(guò)或等于(>=)則跳轉(zhuǎn) 進(jìn)位標(biāo)志=0 JNC,JNB JNAE
JNB 如果不低于則跳轉(zhuǎn)(不 <) 進(jìn)位標(biāo)志=0 JNC,JAE JB
JB 如果低于(<)則跳轉(zhuǎn) 進(jìn)位標(biāo)志=1 JC,JNAE JNB
JNAE 如果不超過(guò)或等于(不>=)則跳轉(zhuǎn) 進(jìn)位標(biāo)志=1 JC,JB JAE
JBE 如果低于或等于(<=)則跳轉(zhuǎn) 進(jìn)位標(biāo)志=1或0標(biāo)志=1 JNA JNBE
JNA 如果不超過(guò)(不>)則跳轉(zhuǎn) 進(jìn)位標(biāo)志=1或0標(biāo)志=1 JBE JA
JE 如果相等(=)則跳轉(zhuǎn) 0標(biāo)志=1 JZ JNE
JNE 如果不相等(<>)則跳轉(zhuǎn) 0標(biāo)志=0 JNZ JE
表7-3 使用有符號(hào)數(shù)比較的JCC指令
指 令 描 述 條 件 別 名 相反指令
JG 如果大于(>)則跳轉(zhuǎn) 符號(hào)標(biāo)志=溢出標(biāo)志或0標(biāo)志=0 JNLE JNG
JNLE 如果小于或等于(<=)則跳轉(zhuǎn) 符號(hào)標(biāo)志=溢出標(biāo)志或0標(biāo)志=0 JG JLE
JGE 如果大于或等于(>=)則跳轉(zhuǎn) 符號(hào)標(biāo)志=溢出標(biāo)志 JNL JGE
JNL 如果不小于(不<)則跳轉(zhuǎn) 符號(hào)標(biāo)志=溢出標(biāo)志 JGE JL
JL 如果小于(<)則跳轉(zhuǎn) 符號(hào)標(biāo)志<>溢出標(biāo)志 JNGE JNL
JNGE 如果大于或等于(>=)跳轉(zhuǎn) 符號(hào)標(biāo)志<>溢出標(biāo)志 JL JGE
JLE 如果小于或等于(<=)跳轉(zhuǎn) 符號(hào)標(biāo)志<>溢出標(biāo)志或0標(biāo)志=1 JNG JNLE
JNG 如果不大于(不>)則跳轉(zhuǎn) 符號(hào)標(biāo)志<>溢出標(biāo)志或0標(biāo)志=1 JLE JG
JE 如果等于(=)則跳轉(zhuǎn) 0標(biāo)志=1 JZ JNE
JNE 如果不等于(<>)則跳轉(zhuǎn) 0標(biāo)志=0 JNZ JE
接下來(lái)將對(duì)“相反指令”一列進(jìn)行簡(jiǎn)單的說(shuō)明。在許多情況下,需要產(chǎn)生與某條分支指令條件相反的分支(在本章后面會(huì)給出示例),即相反分支。除了兩個(gè)例外,都可以按下面的簡(jiǎn)單規(guī)則(后面統(tǒng)稱為N/No N規(guī)則)產(chǎn)生相反分支: ● 如果Jcc的第二個(gè)字母不是“n”,則在“j”后面插入一個(gè)“n”。例如:je對(duì)應(yīng)為jne,jl對(duì)應(yīng)為jnl。 ● 如果Jcc的第二個(gè)字母是“n”,則去掉指令中的“n”。例如:jng對(duì)應(yīng)為jg,jne對(duì)應(yīng)為je。 不遵循這兩條規(guī)則的兩個(gè)例外是jpe(奇偶位為偶跳轉(zhuǎn))和jpo(奇偶位為奇跳轉(zhuǎn))。這兩個(gè)例外并不會(huì)導(dǎo)致什么問(wèn)題,因?yàn)?#xff1a;(a)很少需要測(cè)試奇偶標(biāo)志;(b)可以使用別名jp和jnp替代jpe和jpo。而“N/No N”規(guī)則對(duì)jp和jnp是適用的。 雖然jge是jl的相反指令,但是建議使用jnl作為jl的相反指令。因?yàn)楹苋菀渍`認(rèn)為“大于是小于的相反”,從而把jg當(dāng)作jl的相反指令。您可以堅(jiān)持使用“N/No N”規(guī)則以避免這種混淆。 80x86條件跳轉(zhuǎn)指令提供了這樣的能力:根據(jù)判斷條件將程序流分支到兩條路徑中的某一條。例如,要實(shí)現(xiàn):如果BX等于CX,則寄存器AX的值加1。可以使用下面的代碼來(lái)完成該功能: cmp(bx,cx ); jne SkipStmts; inc(ax ); SkipStmts: 其中的訣竅是使用相反分支指令來(lái)跳過(guò)在條件滿足的情況下需要執(zhí)行的指令。請(qǐng)堅(jiān)持使用前面介紹的“N/no N”規(guī)則來(lái)選擇相反分支指令。 使用條件跳轉(zhuǎn)指令還可以實(shí)現(xiàn)循環(huán)。例如,下面的代碼序列實(shí)現(xiàn)了從用戶輸入讀入一串字符,并將字符存儲(chǔ)到一組連續(xù)的單元中,直到用戶輸入回車鍵。 mov(0,edi ); RdLnLoop: stdin.getc(); //Read a character into the AL register. mov(al,Input [edi])); //Store away the character. inc(edi ); //Move on to the next character. cmp(al,stdio.cr ); //See if the user pressed Enter. jne RdLnLoop; 與setcc指令類似,條件跳轉(zhuǎn)指令分為兩類—— 測(cè)試特殊處理器標(biāo)志位的條件跳轉(zhuǎn)指令(例如jz、jc、jno)和測(cè)試某些條件(小于、大于等)的條件跳轉(zhuǎn)指令。當(dāng)測(cè)試某個(gè)條件時(shí),條件跳轉(zhuǎn)指令通常緊跟在一個(gè)cmp指令之后。cmp指令設(shè)置標(biāo)志位后,如果是無(wú)符號(hào)數(shù)比較,使用ja、jae、jb、jbe、je或jne等指令測(cè)試這些標(biāo)志來(lái)判斷是否小于、小于等于、等于、不等于、大于或大于等于;如果是有符號(hào)數(shù)比較,則使用jl、jle、je、jne、jg、jge指令。 條件跳轉(zhuǎn)指令測(cè)試標(biāo)志位,但不影響標(biāo)志位。

轉(zhuǎn)載于:https://blog.51cto.com/liuchang/77468

總結(jié)

以上是生活随笔為你收集整理的关于汇编跳转指令的说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。