找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4556|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

【個(gè)人理解】ARM 指令集中,SBC 為什么C要取反

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-3-4 14:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
需要注意的是 ,在SUBS 指令中,如果發(fā)生了借位操作 ,CPSR 寄存器中的 C 標(biāo)志位設(shè)置成 0:如果沒(méi)有發(fā)生借位操作CPSR 寄存器中的 C 標(biāo)志位設(shè)置成1。這與ADDS 令中的進(jìn)位指令正好相反 。這主要是為了適應(yīng) SBC 等指令的操作需要。
  SBC  帶位減法指令:
SBC 指令從寄存器<Rn>中減去<shifter_operand>表示的數(shù)值,再減去寄存器CPSR 中C 條件標(biāo)志位的反碼 ,并把結(jié)果保存到目標(biāo)寄存器< Rd>中 ,同時(shí)根據(jù)操作的結(jié)果更新 CPSR   中相應(yīng)的條件標(biāo)志位。
《ARM體系結(jié)構(gòu)與編程》杜春雷 P67
這個(gè)地方怎么理解??反向設(shè)置再取反碼不是扯淡嗎?
我認(rèn)為是這樣的,上邊紅色字體的這句話表述不準(zhǔn)確,SUB本身是做減法,靠的是補(bǔ)碼,也就是補(bǔ)(補(bǔ)Rn> + 補(bǔ)<shifter_operand> + X),這個(gè)X就代表是否借位。
假設(shè)發(fā)生了借位,這時(shí)候C標(biāo)注位為0,則對(duì)0取反,得到的是0xFFFF(假設(shè)是16位操作系統(tǒng),就是16個(gè)1),而0xFFFF剛好是-1的補(bǔ)碼,所以X也就是0xFFFF,也就是說(shuō)在發(fā)生借位的情況下,在十進(jìn)制的世界發(fā)生的實(shí)際上就是“減一”,符合需求。
相應(yīng)的,如果沒(méi)有借位,對(duì)1取反,的到0x0000,正好是-0的補(bǔ)碼,符合需求。
===以下繼續(xù)引用:
SBC 指令和 SUBS 指令聯(lián)合使用可以實(shí)現(xiàn)兩個(gè) 64 位的操作數(shù)相減 。如果寄存器RO 和 R I 中放置’一個(gè) 64 位的源操作數(shù),其中 RO 中放置低32 位數(shù)值:寄存器R2 和R3 中放置另一個(gè) 64 位的源操作數(shù),其中 R2 中放置低32 位數(shù)值。下面的指令序列實(shí)現(xiàn)了兩個(gè)64 位操作數(shù)的減法操作 。
SUBS R4 , R0 , R2 SBC  R5, Rl , R3
需要注意的是 ,在SBCS 指令中,如果發(fā)生了借位操作,CPSR 寄存器中的 C 標(biāo)志位設(shè)置成 0:如果沒(méi)有發(fā)生借位操作,CPSR 寄存器中的 C 標(biāo)志位設(shè)置成1。這與ADDS 指令中的進(jìn)位指令正好相反 。
以上理解,請(qǐng)指正!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表