官术网_书友最值得收藏!

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。讀者可以隨機找一些整數,判斷其是否是立即數。

主站蜘蛛池模板: 双柏县| 嘉义市| 富裕县| 江门市| 石柱| 尉氏县| 平南县| 澎湖县| 榆林市| 左云县| 鸡东县| 广丰县| 得荣县| 吉首市| 信宜市| 通城县| 汕尾市| 葫芦岛市| 务川| 大英县| 辉县市| 嘉禾县| 赤壁市| 新河县| 资阳市| 鹤岗市| 麻栗坡县| 德清县| 天柱县| 井陉县| 陇川县| 满城县| 高青县| 洛川县| 临安市| 杂多县| 碌曲县| 青阳县| 新丰县| 盐池县| 呼伦贝尔市|