2011-03-04 70 views
2

我開始裝配,我使用nasm裝配代碼, 我試圖處理駐留在內存中的字符串並將其更改, 我想檢查一個字節是否在一定的範圍(ascii),所以我可以決定如何處理它, 我似乎無法計算如何檢查一個值是否在一定的範圍內,我知道所有關於 不同類型的跳轉標誌,但怎麼可以我結合了2個cmp語句?裝配中的雙重條件檢查

我的問題是: 我怎麼會產生類似於這個在組裝?

if (x>=20 && x<=100) 
    do something 

非常感謝!

回答

4

取決於你所使用的語法,並假設x是在eax寄存器,這樣的事情:

cmp %eax, 20 
jl ELSE 
cmp %eax, 100 
jg ELSE 
#do something 
jmp END 

ELSE: 
#do else 

END: 
+0

謝謝!最終使用了上述模式 – Matan 2011-03-04 17:14:06

0

那樣?

x<20 
if false jump to ELSE 
x>100 
if false jump to ELSE 
    do something 
    jump to ENDIF 
:ELSE 
    do something else 
:ENDIF 

還是你的意思是隻使用一個彙編指令?

+0

是...是有隻用一個指令的方式嗎?或者它們中的最小數量 – Matan 2011-03-04 16:34:12

+1

彙編中的指令確實是_one_事情。如果你不是隻做一件事,那麼它就不能在一條指令中完成,除非它們是一個特殊的指令。大會非常冗長。 – 2011-03-04 16:45:31

1

你可以嘗試從一個高級語言編譯它(C/C++/.. 。)在高優化(-O3代表gcc),並查看編譯器生成的內容(objdump)。它應該生成非常有效的代碼。

+1

我幾乎建議先運行它,而不進行優化。運行它可能會導致代碼不易理解(更奇特的說明)。絕對看所有級別的優化(包括沒有)的代碼。 – 2011-03-04 16:44:03

20

來表達這樣一個範圍檢查只使用一個單一的條件跳轉的方式:

 sub %eax, 20 
    cmp %eax, 80 
    ja END 
    // do something 
END: ret 

這是一個很常見的優化技巧與整數範圍工作時。最初的減法將範圍[20,100]映射到[0,80];然後用單個無符號的比較來檢查該範圍內的成員資格。

還要注意的是同樣的事情可以在C來完成:

unsigned int upperBound = 100; 
unsigned int lowerBound = 20; 
if (yourValue - lowerBound <= upperBound - lowerBound) { 
    // do something 
}