警告:回答新手。可能會讓有經驗的用戶死亡。
我不知道,如果你誤用術語,或者如果你真的想用predicated instructions 。
在後一種情況下,使用ARM v6 predication作爲研究案例(和繼承,你對寄存器使用場所),裝配簡單
;r1 = A r2 = B r3 = C r4 = D r5 = E
;
;A, B unsigned | ;A, B signed
|
cmp r1, r2 | cmp r1, r2
|
movhi r3, r1 | movgt r3, r1
movhi r4, r2 | movgt r4, r2
movhi r5, #0 | movgt r5, #0
|
movls r3, r2 | movle r3, r2
下面筆者就給根據所涉及的變量的符號兩個版本。
movhi
意味着移動如果更高。 movls
意味着移動如果更低或相同。
movgt
意味着如果移動更大。 movle
表示如果小於或等於則移動。
它們的意思是相同的算術比較,只是後者使用正確的標誌來表示有符號數。
我對指令進行分組,因此很容易識別if-和其他塊。
請注意同一塊中的指令具有相同的後綴(例如,hi
和ls
)。
真正使這個代碼IF-THEN-ELSE結構,而不是別的東西是事實,條件hi
- ls
和gt
- le
是互斥(只有三三兩兩的人可以爲真) 。
所以只能執行一個指令塊。
使用非互斥條件會產生多個if-else-else語句。
如果誤用的術語,你其實是想只是爲了實現一個條件語句(或選擇),即一個IF-THEN-ELSE,那麼通常的做法是條件分支作爲Nutan已經顯示的2。
這裏稍微更可讀的版本:
cmp r1, r2
bls _A_less_same_B
mov r3, r1
mov r4, r2
eor r5, r5, r5
b _end_if
_A_less_same_B:
mov r3, r2
_end_if:
給你的負擔,把這段代碼轉換有符號整數工作。
用冒號(:
)結束的花式字被稱爲標籤,它們命名在代碼點(和數據)一個有用的方法。
想想那是靈活的行號。
b
裝置分支,一旦它被執行的下一個指令是從(從_end_if
例如)指定爲操作數的標籤(地址)取出。
bls
只是一個斷言b
(bls
裝置分支如果小於或相同),俗稱條件分支。
有條件分支就像普通分支一樣,但如果指定的條件不符合,它們可以被「忽略」。
如果符合條件並且CPU執行跳轉,則條件跳轉被認爲是取得,從而從指定爲操作數的標籤中獲取下一條指令。
它被說成是不採取如果條件不滿足,並且CPU繼續從指令分支後的執行(該程序通過流下降)。
「條件」通常意味着標誌設置和清除。 一些指令,如cmp
,設置並清除這些標誌。
其他說明,如bls
使用這些標誌。
這些標誌保存在專用寄存器(ARM中的ps
)中,但有一些體系結構,最顯着的是MIPS,它們沒有標誌寄存器。
你可以用你的手指來模擬程序流程。例如,如果A > B
流量如下:
[Start Here]
¯¯¯¯+¯¯¯¯¯
cmp r1, r2 |
bls _A_less_same_B + [Branch not taken, fall through]
|
mov r3, r1 |
mov r4, r2 |
eor r5, r5, r5 |
|
b _end_if +--[Branch always taken]----+
|
_A_less_same_B: |
mov r3, r2 |
|
_end_if: +--[Land here]--------------+
|
V
彎曲是指以圖片,我們想跳過代碼「在跳」(在這種情況下其他)。
我不承認你的問題的大會味道,所以我不能幫助編寫具體的例子。
無論如何,我不會這樣做,因爲我覺得這個一般的解釋是足夠的,並希望我這邊缺乏努力會促使你嘗試自己解決這個問題。
這是學習路線上的強制性步驟。
指令被獲取,解碼,(可能發行過),但只有在特定的標誌設置或清除執行。
請注意,條件分支如果可能,最好避免。根據目標微體系結構的不同,可能有一個更優化的方式來達到相同的結果。這只是值得注意的,現在不要打擾它。
實際上將成爲地址的偏移量。
你問什麼彙編語言? – interjay