2016-05-14 39 views
-2

我想這段代碼轉換組件裝配使用斷言指令轉換C到被斷言指令

If (A>B){ 

    C=A; 
    D=B; 
    E=0 

} 

else{ 

    C=B; 
} 

它是正確的還是怎麼用跳?

cmp R1,R2; considering B is assigned to R2 and A assigned to R1 
movlf R3,R1;R3 assign to C 
mov R4,R2;R4 assign to D 
mov R5,0; R5 assign to E 
movlt R3,R2 
+4

你問什麼彙編語言? – interjay

回答

7

警告:回答新手。可能會讓有經驗的用戶死亡。


我不知道,如果你誤用術語,或者如果你真的想用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-其他塊。
請注意同一塊中的指令具有相同的後綴(例如,hils)。

真正使這個代碼IF-THEN-ELSE結構,而不是別的東西是事實,條件hi - lsgt - 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只是一個斷言bbls裝置分支如果小於或相同),俗稱條件分支

有條件分支就像普通分支一樣,但如果指定的條件不符合,它們可以被「忽略」。
如果符合條件並且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 

彎曲是指以圖片,我們想跳過代碼「在跳」(在這種情況下其他)。


我不承認你的問題的大會味道,所以我不能幫助編寫具體的例子。
無論如何,我不會這樣做,因爲我覺得這個一般的解釋是足夠的,並希望我這邊缺乏努力會促使你嘗試自己解決這個問題。

這是學習路線上的強制性步驟。


指令被獲取,解碼,(可能發行過),但只有在特定的標誌設置或清除執行。

請注意,條件分支如果可能,最好避免。根據目標微體系結構的不同,可能有一個更優化的方式來達到相同的結果。這只是值得注意的,現在不要打擾它。

實際上將成爲地址的偏移量。

+4

這是一個非常好的答案,不是一個很好的問題。不錯的工作! –

+3

在ARM上,'mov r5,#0'是一種更好,更高效的方法來清零寄存器。感覺奇怪的是不使用'xor',但這隻適用於x86,其中可變長度指令編碼意味着避免立即字節實際上節省了空間,並且被認爲是一個調零習慣用法。在ARM Thumb2機器代碼中,'eor r5,r5'是4B指令,但是'mov r5,#0'是2B指令。另外,'eor'會對舊值產生錯誤的依賴,因爲沒有理由將ARM微架構與特殊情況'相同或相同'作爲歸零習慣用法。 –

+1

@PeterCordes我的直覺告訴我沒有零成語,但我懶得去檢查。感謝提供,我正在更新答案。 –