W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
現(xiàn)代處理器使用了非常尖端的技術(shù)來盡可能快地執(zhí)行代碼。一個(gè)普遍技術(shù)稱為預(yù)測(cè)執(zhí)行。這種技術(shù)使用CPU的并行處理能力來同時(shí)執(zhí)行多條指令。條件分支與這項(xiàng)技術(shù)有沖突。一般說來,處理器是不知道分支是否會(huì)執(zhí)行。如果執(zhí)行了,跟沒有執(zhí)行相比執(zhí)行的是一組不同的指令。處理器試著預(yù)測(cè)分支是否執(zhí)行。如果預(yù)測(cè)錯(cuò)誤,處理器就浪費(fèi)了它的時(shí)間去執(zhí)行了一些錯(cuò)誤的代碼。
SETxx 指令提供了在一定情況下替換分支的方法?;贔LAGS寄存器的狀態(tài),這些指令將一個(gè)字節(jié)的寄存器或內(nèi)存空間中的值置為0或1。在SET后的字符與條件分支使用的是一樣的。如果SETxx 條件為真,那么儲(chǔ)存的結(jié)果就為1,如果為假,則儲(chǔ)存的結(jié)果就為0。例如:
使用這些指令,你可以開發(fā)出一些進(jìn)行數(shù)值運(yùn)算的精巧的技術(shù),而不需要使用分支。
例如,考慮查找兩個(gè)數(shù)的最大數(shù)的問題。這個(gè)問題的標(biāo)準(zhǔn)解決方法是使用一條CMP指令再使用條件分支對(duì)最大值進(jìn)行操作。下面這個(gè)例子展示了不使用分支如何找到最大值。
這個(gè)訣竅是產(chǎn)生一個(gè)可以用來選擇出正確的最大值的俺碼。在30行的SETG指令如果第二個(gè)輸入值是最大值就將BL置為1,否則就置為0。這
不是真正需要的掩碼。為了得到真正需要的掩碼,31行對(duì)整個(gè)EBX寄存器使用了NEG指令。(注意:EBX在前面已經(jīng)置為0了。)如果EBX等于0,那
么這條指令就不做任何事情;但是如果EBX為1,結(jié)果就是-1的補(bǔ)碼表示或0xFFFFFFFF。這正好是需要的位掩碼。剩下的代碼就是使用這個(gè)位掩
碼來選擇出正確的輸入的最大值。
另外一個(gè)可供選擇的訣竅是使用DEC語句。在上面的代碼中,如果用DEC代替NEG,那么結(jié)果同樣會(huì)是0或0xFFFFFFFF。但是,與使用NEG相比,得到值將是反過來的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: