我開始裝配,我使用nasm裝配代碼, 我試圖處理駐留在內存中的字符串並將其更改, 我想檢查一個字節是否在一定的範圍(ascii),所以我可以決定如何處理它, 我似乎無法計算如何檢查一個值是否在一定的範圍內,我知道所有關於 不同類型的跳轉標誌,但怎麼可以我結合了2個cmp語句?裝配中的雙重條件檢查
我的問題是: 我怎麼會產生類似於這個在組裝?
if (x>=20 && x<=100)
do something
非常感謝!
我開始裝配,我使用nasm裝配代碼, 我試圖處理駐留在內存中的字符串並將其更改, 我想檢查一個字節是否在一定的範圍(ascii),所以我可以決定如何處理它, 我似乎無法計算如何檢查一個值是否在一定的範圍內,我知道所有關於 不同類型的跳轉標誌,但怎麼可以我結合了2個cmp語句?裝配中的雙重條件檢查
我的問題是: 我怎麼會產生類似於這個在組裝?
if (x>=20 && x<=100)
do something
非常感謝!
取決於你所使用的語法,並假設x
是在eax
寄存器,這樣的事情:
cmp %eax, 20
jl ELSE
cmp %eax, 100
jg ELSE
#do something
jmp END
ELSE:
#do else
END:
那樣?
x<20
if false jump to ELSE
x>100
if false jump to ELSE
do something
jump to ENDIF
:ELSE
do something else
:ENDIF
還是你的意思是隻使用一個彙編指令?
是...是有隻用一個指令的方式嗎?或者它們中的最小數量 – Matan 2011-03-04 16:34:12
彙編中的指令確實是_one_事情。如果你不是隻做一件事,那麼它就不能在一條指令中完成,除非它們是一個特殊的指令。大會非常冗長。 – 2011-03-04 16:45:31
你可以嘗試從一個高級語言編譯它(C/C++/.. 。)在高優化(-O3代表gcc),並查看編譯器生成的內容(objdump)。它應該生成非常有效的代碼。
我幾乎建議先運行它,而不進行優化。運行它可能會導致代碼不易理解(更奇特的說明)。絕對看所有級別的優化(包括沒有)的代碼。 – 2011-03-04 16:44:03
有是來表達這樣一個範圍檢查只使用一個單一的條件跳轉的方式:
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
}
謝謝!最終使用了上述模式 – Matan 2011-03-04 17:14:06