2015-05-06 181 views
0

在Assembly中使用分支命令困惑,主要是BNEBEQ。 所以,我必須寫的僞代碼的彙編代碼:如果其他OR語句在Assembly中?

X = 5,Y = 10,Z = 15

如果X = 4 & &ý== 10 || Z = 20

A = X + Y - 2

否則R 1 = Z - 5 + X

我編碼凱爾uVision5的的ARM Cortex M0加(如果沒有線索是需要信息)在它的低寄存器是R0-R7這個特定的板。

我知道如何編寫if else聲明本身,但我主要是問我如何處理代碼的OR部分。明顯的X!= 4是真的,並且Y == 10是真的,然後檢查Z = 20是否爲假,那麼我將檢查X!= 4是否先跳,使用BNE標籤跳轉來檢查Y,使用BEQ來檢查Z,這是錯誤的,但既然方程已經是真的,我會跳到BNE endif聲明A=X+Y-2

然後在它們之間沒有標籤我會寫彙編器的else語句,如果第一個BNE標籤是某種錯誤..?

A EQU 0x2000000 
R EQU 0x2000004 
X EQU 0x2000008 
Y EQU 0x200000C 
Z EQU 0x2000010 

LDR R7, =X 
LDR R0, [R7] 
ADD R0, #5 ; X = 5 in R0 
CMP R0, #4 ; Compare X != 4 
BNE jumpToY 

jumpToY 
LDR R7, =Y 
LDR R1, [R7] ; Y = 10 in R1 
CMP R1, #10 ; Compare Y == 10 
BEQ jumpToZ 

jumpToZ 
etc... 
+0

測試失敗後立即跳轉到失敗目標。 –

+0

對不起,我仍然是一個彙編程序的初學者,我將如何去分支到代碼中的失敗目標(這意味着else語句正確..?)。 @ IgnacioVazquez-Abrams –

+0

隨着跳轉指令。如果測試通過,你會跳過。 –

回答

1

asm對於使用由一條指令設置標誌,然後是分支或跳轉條件指令的處理器通常起作用。在分支/跳轉條件之前的某個時刻,您設置標誌,比較例如在這種情況下執行此操作。條件指令的分支工作方式是,如果條件爲真,它就會按照goto在C中工作的方式分支到該地址。如果條件不成立,則它不會。

if(x!=4) goto label0; 
label2: 
if(z==20) goto label1; 
R = Z - 5 + X; 
goto done; 
label0: 
if(y!=10) goto label2: 
... 
done: 
從頂部

所以如果x不是四個,那麼我們分支爲label0,做在那裏,如果是四個,那麼我們一直走下去,做如果Z == 20 然後在z =重新聚焦= 20如果z = 20然後轉到label1否則繼續前進並做數學。

的組件會是這樣的

ldr r0,=X 
ldr r0,[r0] 
cmp r0,#4 
bne label0 

ldr r2,=Z 
ldr r2,[r2] 
cmp r2,#20 
beq label1 

sub r2,#5 
add r0,r2 
ldr r2,=X 
str r0,[r2] 
b done 

label0: 
ldr r1,=Y 
ldr r1,[r1] 
cmp r1,#10 
bne label2: 

... 

done: 

我把空間沒有特殊原因的樹枝後。在那個第一個標籤上0,如果發生了這種情況,那麼我們接下來執行什麼是在標籤0之後加載的y地址,如果等於標誌被設置,那麼我們不會分支,我們繼續前進並執行Z地址的加載。只要覆蓋邏輯路徑可能爲你自己製作一個真值表對於每一個X!= 4 Y == 10和Z == 20,結果是R =或A =,那麼從最壞的情況下,你可以真正地執行真值表(8組比較)或縮小範圍...並繼續優化,直到你快樂。最終你希望A =代碼的某個地方有一個分支到該函數的結尾,而R =代碼的某處也有一個分支到該函數的結尾,然後根據你的真值表和實現你創建的路徑得到A =或R =代碼,但你必須擊中一個或另一個。

編輯:

注意你的第一個三線看錯

LDR R7, =X 
LDR R0, [R7] 
ADD R0, #5 ; X = 5 in R0 

爲您的評論暗示它未設置X 5增加5至所以無論X是你加5

X

如果要實現這個X = 5,Y = 10,Z = 15

ldr r1,=X 
mov r0,#5 
str r0,[r1] 
ldr r1,=Y 
mov r0,#10 
str r0,[r1] 
ldr r1,=Z 
mov r0,#15 
str r0,[r1] 

然後拿到X並對其進行比較

LDR R7, =X 
LDR R0, [R7] 
CMP R0, #4 ; Compare X != 4 
0

想想你如何去評估你的腦中的邏輯條件。如果你想要A或者B並且你得到了A,那麼你就不需要考慮B.如果你想要A和B並且你沒有A,那麼計算B就沒有意義了。

有純粹主義者誰認爲你應該評估這兩個條件,然後利用對結果進行邏輯比較: 計算 計算乙 和/或結果一起

幸運的是,工程方法獲得了出來:

A和B(假設BEQ是「真」):

Calculate A 
BNE fail 
Calculate B 
BNE fail 
success: 
    ... 
    RET/JMP somewhere ; Don't drop through into fail 
fail: 
    ... 

A或B(再次,假設BEQ爲 「真」):

Calculate A 
BEQ success 
Calculate B 
BNE fail 
success: 
    ... 
    RET/JMP somewhere ; Don't drop through into fail 
fail: 
    ... 
0
A EQU 0x2000000 
R EQU 0x2000004 
X EQU 0x2000008 
Y EQU 0x200000C 
Z EQU 0x2000010 

在這裏,你可以看到條件指令,以防止多餘的跳躍。我們檢查And的第一個2個案例,然後默認爲Or案例。注意,我們還必須跳過其他代碼,以防止兩者都執行。另外請注意,我們會遇到其他情況,以防止額外的跳轉。

; These could be loaded with a singl LDM instruction instead. 
LDR R7, =X 
LDR R0, [R7] 
LDR R7, =Y 
LDR R0, [R7] 
LDR R7, =Z 
LDR R2, [R7] 

CMP R0,#5 
CMPEQ R1,#10 
BEQ FirstCase 

CMP R2,#5 
BEQ FirstCase 
;... Fall Through 

ElseCase: 
    ... 
    j RestOfCode 
FirstCase: 
    ... 

RestOfCode: 

請小心我在盲人身上編了這個,對任何語言來說都是危險的事,ASM更是如此。它應該展示如何處理你想要看到的和/或情況。

您也可以將代碼放入C編譯器並檢查輸出,因爲它也會顯示工作代碼。