指令 s對cpsr中標誌位的影響

2021-06-22 20:01:44 字數 1660 閱讀 7788

各標誌位的含義如下:

所有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 表示運算的結果為零...