需要注意的是 ,在SUBS 指令中,如果發生了借位操作 ,CPSR 寄存器中的 C 標志位設置成 0:如果沒有發生借位操作,CPSR 寄存器中的 C 標志位設置成1。這與ADDS 指令中的進位指令正好相反 。這主要是為了適應 SBC 等指令的操作需要。
SBC 帶位減法指令: SBC 指令從寄存器<Rn>中減去<shifter_operand>表示的數值,再減去寄存器CPSR 中C 條件標志位的反碼 ,并把結果保存到目標寄存器< Rd>中 ,同時根據操作的結果更新 CPSR 中相應的條件標志位。 《ARM體系結構與編程》杜春雷 P67 這個地方怎么理解??反向設置再取反碼不是扯淡嗎? 我認為是這樣的,上邊紅色字體的這句話表述不準確,SUB本身是做減法,靠的是補碼,也就是補(補<Rn> + 補<shifter_operand> + X),這個X就代表是否借位。 假設發生了借位,這時候C標注位為0,則對0取反,得到的是0xFFFF(假設是16位操作系統,就是16個1),而0xFFFF剛好是-1的補碼,所以X也就是0xFFFF,也就是說在發生借位的情況下,在十進制的世界發生的實際上就是“減一”,符合需求。 相應的,如果沒有借位,對1取反,的到0x0000,正好是-0的補碼,符合需求。 ===以下繼續引用: SBC 指令和 SUBS 指令聯合使用可以實現兩個 64 位的操作數相減 。如果寄存器RO 和 R I 中放置’一個 64 位的源操作數,其中 RO 中放置低32 位數值:寄存器R2 和R3 中放置另一個 64 位的源操作數,其中 R2 中放置低32 位數值。下面的指令序列實現了兩個64 位操作數的減法操作 。 SUBS R4 , R0 , R2 SBC R5, Rl , R3 需要注意的是 ,在SBCS 指令中,如果發生了借位操作,CPSR 寄存器中的 C 標志位設置成 0:如果沒有發生借位操作,CPSR 寄存器中的 C 標志位設置成1。這與ADDS 指令中的進位指令正好相反 。 以上理解,請指正!
|