3.2 數據處理指令
3.2.1 mov指令
(1)mov指令
mov指令表示如下。
mov{條件}{S} 目的寄存器,源操作數
mov指令用于將一個立即數從一個寄存器或能被移位的寄存器加載到目的寄存器中。其中S項決定指令的操作是否影響CPSR中條件標志位的值,當沒有S項時,不更新CPSR中條件標志位的值。
指令示例如下。
mov r0,#0x1 ;將立即數0x1傳送到寄存器R0中 mov r1,r0 ;將寄存器R0的值傳送到寄存器R1中 mov pc,r14 ;將寄存器R14的值傳送到PC中,常用于子程序返回 mov r1,r0,LSL#3 ;將寄存器R0的值左移3位后傳送到寄存器R1中
注意:
指令不區分大小寫,程序句尾“;”“//”“@”之后的內容為注釋,在“/*”和“*/”之間的內容為注釋。
(2)什么是立即數
在回答這個問題之前,我們先看下面這條指令。
mov r0,#0xfff
將其編譯后會有以下報錯。
Build target ‘Target 1’ assembling S3C2440.s... S3C2440.s(5): error: A1510E: Immediate 0x00000FFF cannot be represented by 0-255 and a rotation S3C2440.s: 5 00000000 MOV R0,#0xfff S3C2440.s: 1 Error, 0 Warnings Target not created
要想解決這個問題,我們需要了解什么是立即數。立即數是由數據(0~255)循環右移偶數位生成的,判斷規則歸納如下。
① 把數據轉換成二進制形式,并從低位到高位將其分成4位1組,最高位一組不夠4位的,在最高位前補0。
② 數其中1的個數,如果1大于8個,則該數據肯定不是立即數,如果1小于等于8個則進行下面步驟。
③ 如果數據中有連續的、大于等于24個的0,循環左移2的倍數位,使高位全為0。
④ 找到此時數據中1的最高位,去掉前面最大偶數個0。
⑤ 找到最低位的1,去掉其后面最大偶數個0。
⑥ 數剩下的位數,如果小于等于8位,那么這個數就是立即數,反之就不是立即數。
上述示例中的數據是0xfff,先將其轉換為二進制形式。
0000 0000 0000 0000 0000 1111 1111 1111
按照上述規則,最終操作結果如下。
1111 1111 1111
可以看到剩余的位數大于8個,所以該數不是立即數。
(3)mov機器碼
為什么立即數會有如上限定?我們需要從mov指令的機器碼來說起。首先讓我們執行如下程序。
area Example,code,readonly;聲明程序段Example entry;程序入口 start ;此處為測試程序,添加在以下位置即可,之后不再介紹完整程序 mov r1,#0x80000001 over end
使用鼠標指針單擊操作界面的debug按鈕,查看對應的機器碼,如圖3-1所示。

圖3-1 機器碼
得到指令“mov r1,#0x80000001”的機器碼是E3A01106(十六進制)。mov指令機器碼格式如圖3-2所示。

圖3-2 mov指令機器碼格式
根據mov指令格式,我們分析各個位域的含義,如表3-2所示。
表3-2 mov指令機器碼各個位域含義

立即數0x80000001的二進制數如下。
1000 0000 0000 0000 0000 0000 0000 0001
將數據循環左移2位后得到以下結果。
00 0000 0000 0000 0000 0000 0000 0001 10
因此,偏移的值為1(2/2),操作數的值為0000 0110。讀者可以隨機找一些整數,判斷其是否是立即數。
- pytest框架與自動化測試應用
- 大前端三劍客:Vue+React+Flutter
- 軟件需求與可視化模型(微軟技術叢書)
- 嵌入式系統開發之道:菜鳥成長日志與項目經理的私房菜
- Knative最佳實踐
- 從缺陷中學習C/C++
- 百度SEO一本通
- 深度學習:21天實戰Caffe
- Arduino項目開發:智能家居
- 計算機網絡系統集成技術基礎與解決方案
- 構建跨平臺APP:jQuery Mobile移動應用實戰(第2版) (跨平臺移動開發叢書)
- 項目實踐精解:基于EJB 3.0和Web Services的Java應用開發
- 構建移動網站與APP:ionic移動開發入門與實戰 (跨平臺移動開發叢書)
- 工業軟件云戰略
- 軟件工程:理論與實踐(第2版)