算術和邏輯指令
ADC : 帶進位的加法
(Addition with Carry)
ADC{條件}{S} dest = op_1 + op_2 + carry ADC 將把兩個操作數加起來,并把結果放置到目的寄存器中。它使用一個進位標志位,這樣就可以做比 32 位大的加法。下列例子將加兩個 128 位的數。 128 位結果: 寄存器 0、1、2、和 3 第一個 128 位數: 寄存器 4、5、6、和 7 第二個 128 位數: 寄存器 8、9、10、和 11。 ADDS R0, R4, R8 ; 加低端的字 ADCS R1, R5, R9 ; 加下一個字,帶進位 ADCS R2, R6, R10 ; 加第三個字,帶進位 ADCS R3, R7, R11 ; 加高端的字,帶進位 如果如果要做這樣的加法,不要忘記設置 S 后綴來更改進位標志。 ADD : 加法 (Addition) ADD{條件}{S} dest = op_1 + op_2 ADD 將把兩個操作數加起來,把結果放置到目的寄存器中。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值: ADD R0, R1, R2 ; R0 = R1 + R2 ADD R0, R1, #256 ; R0 = R1 + 256 ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1) 加法可以在有符號和無符號數上進行。 AND : 邏輯與 (logical AND) AND{條件}{S} dest = op_1 AND op_2 AND 將在兩個操作數上進行邏輯與,把結果放置到目的寄存器中;對屏蔽你要在上面工作的位很有用。 操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值: AND R0, R0, #3 ; R0 = 保持 R0 的位 0 和 1,丟棄其余的位。 AND 的真值表(二者都是 1 則結果為 1): Op_1 Op_2 結果 0 0 0 0 1 0 1 0 0 1 1 1 BIC : 位清除 (Bit Clear) BIC{條件}{S} dest = op_1 AND (!op_2) BIC 是在一個字中清除位的一種方法,與 OR 位設置是相反的操作。操作數 2 是一個 32 位位掩碼(mask)。如果如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位指示此位保持不變。 BIC R0, R0, #%1011 ; 清除 R0 中的位 0、1、和 3。保持其余的不變。 BIC 真值表 : Op_1 Op_2 結果 0 0 0 0 1 0 1 0 1 1 1 0 譯注:邏輯表達式為 Op_1 AND NOT Op_2 EOR : 邏輯異或 (logical Exclusive OR) EOR{條件}{S} dest = op_1 EOR op_2 EOR 將在兩個操作數上進行邏輯異或,把結果放置到目的寄存器中;對反轉特定的位有用。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值: EOR R0, R0, #3 ; 反轉 R0 中的位 0 和 1 EOR 真值表(二者不同則結果為 1): Op_1 Op_2 結果 0 0 0 0 1 1 1 0 1 1 1 0 MOV : 傳送 (Move) MOV{條件}{S} dest = op_1 MOV 從另一個寄存器、被移位的寄存器、或一個立即值裝載一個值到目的寄存器。你可以指定相同的寄存器來實現 NOP 指令的效果,你還可以專門移位一個寄存器: MOV R0, R0 ; R0 = R0... NOP 指令 MOV R0, R0, LSL#3 ; R0 = R0 * 8 如果 R15 是目的寄存器,將修改程序計數器或標志。這用于返回到調用代碼,方法是把連接寄存器的內容傳送到 R15: MOV PC, R14 ; 退出到調用者 MOVS PC, R14 ; 退出到調用者并恢復標志位 (不遵從 32-bit 體系) MVN : 傳送取反的值 (Move Negative) MVN{條件}{S} dest = !op_1 MVN 從另一個寄存器、被移位的寄存器、或一個立即值裝載一個值到目的寄存器。不同之處是在傳送之前位被反轉了,所以把一個被取反的值傳送到一個寄存器中。這是邏輯非操作而不是算術操作,這個取反的值加 1 才是它的取負的值: MVN R0, #4 ; R0 = -5 MVN R0, #0 ; R0 = -1 ORR : 邏輯或 (logical OR) ORR{條件}{S} dest = op_1 OR op_2 OR 將在兩個操作數上進行邏輯或,把結果放置到目的寄存器中;對設置特定的位有用。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值: ORR R0, R0, #3 ; 設置 R0 中位 0 和 1 OR 真值表(二者中存在 1 則結果為 1): Op_1 Op_2 結果 0 0 0 0 1 1 1 0 1 1 1 1 RSB : 反向減法 (Reverse Subtraction) RSB{條件}{S} dest = op_2 - op_1 SUB 用操作數 two 減去操作數 one,把結果放置到目的寄存器中。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值: RSB R0, R1, R2 ; R0 = R2 - R1 RSB R0, R1, #256 ; R0 = 256 - R1 RSB R0, R2, R3,LSL#1 ; R0 = (R3 << 1) - R2 反向減法可以在有符號或無符號數上進行。 RSC : 帶借位的反向減法 (Reverse Subtraction with Carry) RSC{條件}{S} dest = op_2 - op_1 - !carry 同于 SBC,但倒換了兩個操作數的前后位置。 SBC : 帶借位的減法 (Subtraction with Carry) SBC{條件}{S} dest = op_1 - op_2 - !carry SBC 做兩個操作數的減法,把結果放置到目的寄存器中。它使用進位標志來表示借位,這樣就可以做大于 32 位的減法。SUB 和 SBC 生成進位標志的方式不同于常規,如果需要借位則清除進位標志。所以,指令要對進位標志進行一個非操作 - 在指令執行期間自動的反轉此位。 SUB : 減法 (Subtraction) SUB{條件}{S} dest = op_1 - op_2 SUB 用操作數 one 減去操作數 two,把結果放置到目的寄存器中。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值: SUB R0, R1, R2 ; R0 = R1 - R2 SUB R0, R1, #256 ; R0 = R1 - 256 SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1) 減法可以在有符號和無符號數上進行。 移位指令 ARM 處理器組建了可以與數據處理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。你還可以使用桶式移位器影響在 LDR/STR 操作中的變址值。 譯注:移位操作在 ARM 指令集中不作為單獨的指令使用,它是指令格式中是一個字段,在匯編語言中表示為指令中的選項。如果數據處理指令的第二個操作數或者單一數據傳送指令中的變址是寄存器,則可以對它進行各種移位操作。如果數據處理指令的第二個操作數是立即值,在指令中用 8 位立即值和 4 位循環移位來表示它,所以對大于 255 的立即值,匯編器嘗試通過在指令中設置循環移位數量來表示它,如果不能表示則生成一個錯誤。在邏輯類指令中,邏輯運算指令由指令中 S 位的設置或清除來確定是否影響進位標志,而比較指令的 S 位總是設置的。在單一數據傳送指令中指定移位的數量只能用立即值而不能用寄存器。 下面是給不同的移位類型的六個助記符: LSL 邏輯左移 ASL 算術左移 LSR 邏輯右移 ASR 算術右移 ROR 循環右移 RRX 帶擴展的循環右移 ASL 和 LSL 是等同的,可以自由互換。 你可以用一個立即值(從 0 到 31)指定移位數量,或用包含在 0 和 31 之間的一個值的寄存器指定移位數量。 邏輯或算術左移 (Logical or Arithmetic Shift Left) Rx, LSL #n or Rx, ASL #n or Rx, LSL Rn or Rx, ASL Rn 接受 Rx 的內容并按用‘n’或在寄存器 Rn 中指定的數量向高有效位方向移位。最低有效位用零來填充。除了概念上的第 33 位(就是被移出的最小的那位)之外丟棄移出最左端的高位,如果邏輯類指令中 S 位被設置了,則此位將成為從桶式移位器退出時進位標志的值。 考慮下列: MOV R1, #12 MOV R0, R1, LSL#2 在退出時,R0 是 48。 這些指令形成的總和是 R0 = #12, LSL#2 等同于 BASIC 的 R0 = 12 << 2 邏輯右移 (Logical Shift Right) Rx, LSR #n or Rx, LSR Rn 它在概念上與左移相對。把所有位向更低有效位方向移動。如果邏輯類指令中 S 位被設置了,則把最后被移出最右端的那位放置到進位標志中。它同于 BASIC 的 register = value >>> shift。 算術右移 (Arithmetic Shift Right) Rx, ASR #n or Rx, ASR Rn 類似于 LSR,但使用要被移位的寄存器(Rx)的第 31 位的值來填充高位,用來保護補碼表示中的符號。如果邏輯類指令中 S 位被設置了,則把最后被移出最右端的那位放置到進位標志中。它同于 BASIC 的 register = value >> shift。 循環右移 (Rotate Right) Rx, ROR #n or Rx, ROR Rn 循環右移類似于邏輯右移,但是把從右側移出去的位放置到左側,如果邏輯類指令中 S 位被設置了,則同時放置到進位標志中,這就是位的‘循環’。一個移位量為 32 的操作將導致輸出與輸入完全一致,因為所有位都被移位了 32 個位置,又回到了開始時的位置! 帶擴展的循環右移 (Rotate Right with extend) Rx, RRX 這是一個 ROR#0 操作,它向右移動一個位置 - 不同之處是,它使用處理器的進位標志來提供一個要被移位的 33 位的數量。 乘法指令 指令格式 這兩個指令與普通算術指令在對操作數的限制上有所不同: 給出的所有操作數、和目的寄存器必須為簡單的寄存器。 你不能對操作數 2 使用立即值或被移位的寄存器。 目的寄存器和操作數 1 必須是不同的寄存器。 最后,你不能指定 R15 為目的寄存器。 MLA : 帶累加的乘法 (Multiplication with Accumulate) MLA{條件}{S} dest = (op_1 * op_2) + op_3 MLA 的行為同于 MUL,但它把操作數 3 的值加到結果上。這在求總和時有用。 MUL : 乘法 (Multiplication) MUL{條件}{S} dest = op_1 * op_2 MUL 提供 32 位整數乘法。如果操作數是有符號的,可以假定結果也是有符號的。 比較指令 指令格式 譯注:CMP 和 CMP 是算術指令,TEQ 和 TST 是邏輯指令。把它們歸入一類的原因是它們的 S 位總是設置的,就是說,它們總是影響標志位。 CMN : 比較取負的值 (Compare Negative) CMN{條件}{P} status = op_1 - (- op_2) CMN 同于 CMP,但它允許你與小負值(操作數 2 的取負的值)進行比較,比如難于用其他方法實現的用于結束列表的 -1。這樣與 -1 比較將使用: CMN R0, #1 ; 把 R0 與 -1 進行比較 詳情參照 CMP 指令。 CMP : 比較 (Compare) CMP{條件}{P} status = op_1 - op_2 CMP 允許把一個寄存器的內容如另一個寄存器的內容或立即值進行比較,更改狀態標志來允許進行條件執行。它進行一次減法,但不存儲結果,而是正確的更改標志。標志表示的是操作數 1 比操作數 2 如何(大小等)。如果操作數 1 大于操作操作數 2,則此后的有 GT 后綴的指令將可以執行。 明顯的,你不需要顯式的指定 S 后綴來更改狀態標志... 如果你指定了它則被忽略。 TEQ : 測試等價 (Test Equivalence) TEQ{條件}{P} Status = op_1 EOR op_2 TEQ 類似于 TST。區別是這里的概念上的計算是 EOR 而不是 AND。這提供了一種查看兩個操作數是否相同而又不影響進位標志(不象 CMP 那樣)的方法。加上 P 后綴的 TEQ 還可用于改變 R15 中的標志(在 26-bit 模式中)。詳情請參照 psr.html,在 32-bit 模式下如何做請參見這里。 TST : 測試位 (Test bits) TST{條件}{P} Status = op_1 AND op_2
上一篇:nandflash的讀寫(2440)
下一篇:ARM(RISC)和x86(CISC)的技術差異
推薦閱讀
史海拾趣
在環保意識日益增強的背景下,Corstat Containers公司積極響應,推出了可回收、可降解的環保電子元件包裝盒。這一產品不僅滿足了市場對環保產品的需求,還為公司贏得了良好的社會聲譽。同時,公司還加大了對環保技術的研發投入,不斷推出更加環保、高效的電子產品包裝解決方案,進一步鞏固了其在電子行業的領先地位。
除了產品創新,Apacer宇瞻科技還注重為客戶提供量身定制的解決方案。在某次客戶系統升級中,宇瞻科技的技術團隊發現原有SD卡無法滿足大量隨機小數據的存取應用,甚至可能縮短SSD使用壽命。于是,宇瞻科技建議客戶導入Page Mapping技術,并搭配Smart Read Refresh技術的SD卡,成功解決了客戶的存儲問題。這一技術突破不僅幫助客戶實現了系統升級,也為宇瞻科技贏得了更多的信任和贊譽。
全智景公司自成立以來,一直致力于電子視覺技術的研發。早期,公司面臨激烈的市場競爭和技術瓶頸,但全智景團隊憑借堅韌不拔的精神,成功研發出了一款具有劃時代意義的高清攝像頭芯片。這款芯片以其出色的圖像質量和穩定性,迅速獲得了市場的認可,并推動了整個電子視覺行業的進步。這一技術突破不僅讓全智景公司在市場上站穩了腳跟,也為公司后續的發展奠定了堅實的基礎。
町洋公司創立于1983年,由一群志同道合的電子工程師創立。創業初期,町洋專注于接線端子及相關產品的研發與生產,憑借其獨特的設計理念和精湛的生產工藝,逐漸在臺灣市場上嶄露頭角。公司創始人深知產品質量的重要性,因此始終堅持嚴格的品質控制,贏得了客戶的信賴。
1968年,勝利公司(VICTOR)在臺灣創立,創始人李明懷揣著對羽毛球運動的熱愛和對品質的執著,決定進入羽毛球用品制造行業。他帶領團隊克服技術難關,不斷研發新產品,逐漸在市場上嶄露頭角。
為了更好地拓展市場,D3 Semiconductor與全球知名的電子元件分銷商貿澤電子(Mouser Electronics)建立了合作伙伴關系。根據協議,貿澤電子儲備了D3 Semiconductor的完整650伏額定電壓超結MOSFET產品線,并將其推向全球市場。這一合作不僅加強了D3 Semiconductor在全球市場的競爭力,也為公司帶來了更多的商業機會。
ISD4003系列工作電壓3V,單片錄放時間4至8分鐘,音質好,適用于移動電話及其他便攜式電子產品中。芯片采用CMOS技術,內含振蕩器、防混淆濾波器、平滑濾波器、音頻放大器、自動靜噪及高密度多電平閃爍存貯陳列。芯片設計是基于所有操作必須由微控制器控 ...… 查看全部問答∨ |
實例分為兩部分,第1部分連續輸入數據處理的電路設計是我們的課程設計,有詳細的設計過程(分析過程,數據流圖,以及狀態機,源代碼仿真和綜合電路圖),另一個是老師給的例題,有100多個例子吧,不過只有源代碼和題目。希望能給大家做一個參考!!… 查看全部問答∨ |
我先說一下我的需求,就是要在播放影片的畫面上面顯示影片的碼率之類的. 假設現在影片的碼率是700kbps,我要在影片的某個位置顯示出來,比如說左上角,這個怎么做出來呢? 或者給我指條明路. 謝謝 PS: 現在TCPMP能在我的機器上面跑了,也能正常解碼.… 查看全部問答∨ |
功能描述: 用單片機實現傳感器檢測功能,通過兩個按鍵和一個LED顯示模塊來實現設置檢測閥值的大小,2個按鍵分別為"加1"和"減1"功能,LED上顯示的當前閥值大小.讀入的傳感器信號與設置的閥值進行比較,達到所設閥值大小輸出報警.請 ...… 查看全部問答∨ |
一直從事asp.net開發,對wince開發一無所知。 目前有一個gps設備,需要開發征對此設備的應用程序開發。該設備是wince 5.0操作系統。 我使用的是vs 2008做為開發工具(C#)。 我在vs2008中新建項目-智能設備 右側僅有智能設備選項,請問我還需要安 ...… 查看全部問答∨ |
現在的問題是,程序無法檢測到其中的位數,并做出相應的處理 表象就是:在串口調試助手中輸入B****E,無任何返回值 程序如下: #include <iom128v.h> //工作頻率7.3728Mhz #include ...… 查看全部問答∨ |
通常我們加載wince系統,總是編譯好eboot然后下載到flash里面,根據菜單提示下載NK。而實際的產品中,可以不用BOOTLOADER,那它是怎么實現系統加載的? 還有個問題,就是OAL的代碼也可以完成所有的bootloader的功能,為什么一定要寫個bootloader? ...… 查看全部問答∨ |
【求助】想在嵌入式板(S3C2410)用java語言編寫程序在LCD上顯示圖像和視頻,我該如何入手? 最近在學習嵌入式,想在嵌入式板(S3C2410)用java語言編寫程序在LCD上顯示圖像和視頻,到現在沒有一點頭緒,不知道從什么地方入手。在嵌入式linux上的java虛擬機用什么?… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- 傳統晶體管的極限!臺積電3nm N3P已量產
- 分析師稱H20出口管制毫無意義:對中國AI發展影響不大