arm彙編之 bne與beq

2021-07-27 05:59:31 字數 1008 閱讀 8373

在網上看了一些bne和beq的區別,但是對於初學者來說,容易越看越糊塗,因此簡單介紹下:

我們先分析cpsr暫存器的z標識位:

cmp指令可以直接影響cpsr暫存器的z標識位(條件位),從圖中可以看出:比較結果為0時,z位置1,比較結果為非0時,z位為0;

再來看一段sdram重定位中的子過程(不必糾結於子過程的功能):

// 清bss段,其實就是在鏈結位址處把bss段全部清零

clean_bss:

ldr r0, =bss_start

ldr r1, =bss_end

cmp r0, r1 // 如果r0等於r1,說明bss段為空,直接下去

beq run_on_dram // 清除bss完之後的位址

mov r2, #0

clear_loop:

str r2, [r0], #4 // 先將r2中的值放入r0所指向的記憶體位址(r0中的值作為記憶體位址),

cmp r0, r1 // 然後r0 = r0 + 4

bne clear_loop

beq:「beq run_on_dram」

如果 r0 - r1 = 0 ,程式跳轉到run_on_dram處,再向下執行,此時cpsr的z標識位為1,我們可以理解為:cmp的結果為0,或者cpsr的z標識位為1時,程式跳轉到beq 後的標籤處;

bne:

「bne clear_loop」  如果 r0 - r1  != 0 ,程式跳轉到clear_loop處,再向下執行,此時cpsr的z標識位為0,我們可以理解為:cmp的結果為1,或者cpsr的z標識位為0時,程式跳轉到bne 後的標籤處;

對於cpsr暫存器的條件位的 n z c v,可以參考:關於標識位影響

arm指令之beq和bnq

本文將主要討論arm指令中的beq和bnq指令,這倆指令也比較容易搞混。先看下arm指令的基本格式 由上面的指令格式,實際上beq可以看做b eq,bnq可以看做b nq 即opcode指令助記符b和cond指令條件的結合。事實上很多指令都可以看做是opcode指令助記符b和cond指令條件的結合,...

ARM學習之ARM指令與彙編 二

偽操作是arm組合語言源程式中的特殊指令助記符,其作用是為了完成匯程式設計序做各種準備工作的,指示匯程式設計序對組合語言源程式的編譯操作。是編譯器執行的指令,而不是arm處理器執行的指令。1 用於定義全域性變數的gbla gbll和gbls。2 用於定義區域性變數的lcla lcll和lcls。3 ...

ARM彙編之棧

建立程序的時候,會分配記憶體作為棧。實際棧指令 push,pop 是其他指令的別名,實際指令是str ldr或者其延伸指令。例s b sp,push 棧實現的幾種情況 堆疊型別 store load 完全下降 高位址在上,低位址在下 stmfd s b ldmfd ldm 完全公升序 高位址在下,低...