之前看到過一個延時函數段:
delay:
ldr r2, =7000000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1 //r2=r2-1
cmp r2, r3 //cmp會影響z標誌位,如果r2=r3,則Z=1;下一句中eq就會成立
bne delay_loop //
mov pc, lr //函數返回 延時函數
現在我們來分析一下這個函數的各個指令。
1、cmp比較指令
假設現在AX寄存器中的數是0004H,BX寄存器中的數是0007H。
執行的指令是:CMP AX, BX
執行這條指令時,先做用AX中的數減去BX中的數的減法運算。各標誌位將會被分別設置成以下值:
CF:是否有進位或者借位
ZF:0標誌位,就是結果是否爲0
OF:溢出標誌位,是否計算機結果溢出了
SF:符號位,0爲正,1爲負
2、bne指令
bne: 標誌寄存器中Z標誌位不等於零時, 跳轉到BNE後標籤處
beq: 標誌寄存器中Z標誌位等於零時, 跳轉到BEQ後標籤處
上面函數中,比較了r2和r3,它們相減,如果結果爲0,那麼Z標誌位置位,就不跳轉了,否則就會跳轉,形成循環
3、sub r2,r2,#1
把r2裏的數減1,然後放回r2裏面。