各標誌位的含義如下:
所有arm資料處理指令的乘法指令均可選擇使用s字尾,並影響狀態標誌位。而其它指令一般不允許加s字尾,如b 、ldr、swi、mrs等。
n 運算結果的最高位反映在該標誌位。對於有符號二進位制補碼,結果為負數時n=1,結果為正數或零時n=0;
例如:執行movs r0,#0x7fffffff後n=0;因為r0最高位為0
執行movs r0,#0x80000000後n=1;因為r0最高位為1
執行cmp r0,r0後n=0;因為r0-r0=0x00000000;
故n一般看目標暫存器的最高位,即n = rd[31]。
z指令結果為0時z=1(通常表示比較結果「相等」),否則z=0;
例如:執行cmp r0,r0後z=1
執行movs r0,#0後z=1
故z一般看目標暫存器的值是否為0,rd=0時z=1,否則z=0。
c當進行加法運算(包括cmn指令),並且最高位產生進製時c=1,否則c=0。當進行減法運算(包括cmp 指令),
並且最高位產生借位時c=0,否則c=1。對於結合移位操作的非加法/減法指令,c為從最高位最後移出的值,
其它指令c通常不變;
例如:執行 mov r0,#0xf0000000
adds r0,r0,r0
後c=1;
執行 subs r2,r2,r2後c=1,因為r2-r2=0不需要借位。
執行 cmp r3,r3後c=1;
執行 mov r1,0x80000000
movs r0,r1 ,lsr #32
後c=1;
執行
mov r0,#0x10
mov r1,#0x7fffffff
subs r3,r0,r1 ,lsr #1
後c=0;
總之,一般情況下加法進製,減法無借位時c=1; 對於結合移位操作的非加/減法指令,c為最後移出的值。
v當進行加法/減法運算,並且發生有符號溢位時v=1,否則v=0,其它指令v通常不變。
例如:執行mov r1,#0x80000000
adds r1,r1,r1 後v=1;
執行 mov r1,#0x70000000
adds r1,r1,r1 或 cmn r1,r1 後v=1;
執行 ldr r0,=0x8000000
ldr r1,=0x7fffffff
cmp r0,r1 後v=1 ;
總之,兩個負數運算結果第31位為0,則v=1
兩個正數運算結果第31位為1,則v=1。
另外thumb指令一般不需要s字尾,便能影響狀態標誌位。
如 在thumb狀態下下面兩條指令相同
movs r0,#0x00
mov r0,#0x00
mov一般不影響cpsr, 除非執行類似mov pc, lr,效果上等同於bx lr
movs總是會影響cpsr, 包括n,z,c標誌位
執行mov pc, lr,可能會影響到t標誌位,執行movs pc, lr時,cpsr會被spsr覆蓋(核心態)
在thumb**裡不能使用b跳轉到arm**,因為t標誌不會切換,即使跳到arm**,
也會按照thumb方式來執行,bx是跳特殊指令,會根據目標暫存器位址來切換t標誌。
彙編指令對標誌位的影響
mov lea xchg push pop in out 傳送類指令不影響標誌位 add adc sub sbb cmp 加減法指令影響全部標誌位 inc dec 增一減一指令不影響cf neg 求補指令影響除cf外的5個標誌位,對cf位置1 mul imul 乘法指令只影響of位和cf位,對其他位...
為什麼INC,DEC指令不影響CF標誌位呢?
我們知道執行算數運算指令的時候,當結果的最高位與進製或者借位時會把狀態暫存器flags的cf位置為1,否則置為0,但是為什麼inc和dec這樣的指令不影響cf標記位呢?懷著對這個問題的疑惑,在csdn查詢未果後找到了幾個高讚回答,遂記錄以幫助後面有同樣疑惑的朋友。答 因為指令系統設計人員考慮該指令主...
ARM處理器CPSR標誌位和條件符之間的關係
本文目的是要理清arm處理器的cpsr狀態標誌和arm指令的條件符之間的關係。一 cpsr暫存器 arm v4的cpsr暫存器 和儲存它的spsr暫存器 中的位分配如下圖1所示。圖1 程式狀態暫存器格式 n n 1 表示運算的結果為負數 n 0 表示運算的結果為正數或零 zz 1 表示運算的結果為零...