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

3.2 數(shù)據(jù)處理指令

3.2.1 mov指令

(1)mov指令

mov指令表示如下。

mov{條件}{S} 目的寄存器,源操作數(shù)

mov指令用于將一個立即數(shù)從一個寄存器或能被移位的寄存器加載到目的寄存器中。其中S項決定指令的操作是否影響CPSR中條件標志位的值,當沒有S項時,不更新CPSR中條件標志位的值。

指令示例如下。

mov r0,#0x1         ;將立即數(shù)0x1傳送到寄存器R0中
mov r1,r0           ;將寄存器R0的值傳送到寄存器R1中
mov pc,r14          ;將寄存器R14的值傳送到PC中,常用于子程序返回
mov r1,r0,LSL#3    ;將寄存器R0的值左移3位后傳送到寄存器R1中

注意:

指令不區(qū)分大小寫,程序句尾“;”“//”“@”之后的內(nèi)容為注釋,在“/*”和“*/”之間的內(nèi)容為注釋。

(2)什么是立即數(shù)

在回答這個問題之前,我們先看下面這條指令。

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

要想解決這個問題,我們需要了解什么是立即數(shù)。立即數(shù)是由數(shù)據(jù)(0~255)循環(huán)右移偶數(shù)位生成的,判斷規(guī)則歸納如下。

① 把數(shù)據(jù)轉(zhuǎn)換成二進制形式,并從低位到高位將其分成4位1組,最高位一組不夠4位的,在最高位前補0。

② 數(shù)其中1的個數(shù),如果1大于8個,則該數(shù)據(jù)肯定不是立即數(shù),如果1小于等于8個則進行下面步驟。

③ 如果數(shù)據(jù)中有連續(xù)的、大于等于24個的0,循環(huán)左移2的倍數(shù)位,使高位全為0。

④ 找到此時數(shù)據(jù)中1的最高位,去掉前面最大偶數(shù)個0。

⑤ 找到最低位的1,去掉其后面最大偶數(shù)個0。

⑥ 數(shù)剩下的位數(shù),如果小于等于8位,那么這個數(shù)就是立即數(shù),反之就不是立即數(shù)。

上述示例中的數(shù)據(jù)是0xfff,先將其轉(zhuǎn)換為二進制形式。

0000 0000 0000 0000 0000 1111 1111 1111

按照上述規(guī)則,最終操作結(jié)果如下。

1111 1111 1111

可以看到剩余的位數(shù)大于8個,所以該數(shù)不是立即數(shù)。

(3)mov機器碼

為什么立即數(shù)會有如上限定?我們需要從mov指令的機器碼來說起。首先讓我們執(zhí)行如下程序。

    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指令機器碼格式

根據(jù)mov指令格式,我們分析各個位域的含義,如表3-2所示。

表3-2 mov指令機器碼各個位域含義

立即數(shù)0x80000001的二進制數(shù)如下。

1000 0000 0000 0000 0000 0000 0000 0001

將數(shù)據(jù)循環(huán)左移2位后得到以下結(jié)果。

00 0000 0000 0000 0000 0000 0000 0001 10

因此,偏移的值為1(2/2),操作數(shù)的值為0000 0110。讀者可以隨機找一些整數(shù),判斷其是否是立即數(shù)。

主站蜘蛛池模板: 鄂伦春自治旗| 鹰潭市| 荥经县| 塔城市| 梅州市| 黄大仙区| 当涂县| 炉霍县| 繁峙县| 石台县| 安多县| 五寨县| 琼结县| 光山县| 镇安县| 西贡区| 彰武县| 缙云县| 通化县| 阿图什市| 斗六市| 图片| 永善县| 建瓯市| 宁波市| 桦甸市| 板桥市| 灵宝市| 温泉县| 武穴市| 清丰县| 通河县| 宜君县| 黄山市| 泾阳县| 承德县| 枣庄市| 嘉黎县| 特克斯县| 衡水市| 临海市|