新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM體系結(jié)構(gòu)學(xué)習(xí)3

        ARM體系結(jié)構(gòu)學(xué)習(xí)3

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        ARM程序狀態(tài)寄存器:

        ARM體系結(jié)構(gòu)包含1個(gè)當(dāng)前程序狀態(tài)寄存器(CPSR)和5個(gè)各份的程序狀態(tài)寄存器(SPSRs)。使用MSR和MRS指令來(lái)設(shè)置和讀取這些寄存器。

        本文引用地址:http://www.104case.com/article/201611/319366.htm

          當(dāng)前程序狀態(tài)寄存器(CPSR),持有關(guān)于當(dāng)前處理器狀態(tài)的信息。其他5個(gè)各份的程序狀態(tài)寄存器(SPSR),每個(gè)特權(quán)模式都有一個(gè),持有完成在這個(gè)模式下的例外處理時(shí)處理器必須返回的關(guān)于狀態(tài)的信息。

          SPSR用來(lái)進(jìn)行異常處理,其功能包括:

          (1)保存ALU中的當(dāng)前操作信息。

          (2)控制允許和禁止中斷。

          (3)設(shè)置處理器的運(yùn)行模式。

          程序狀態(tài)寄存器的每一位的安排如圖所示。

        圖程序狀態(tài)寄存器格式

          1.條件碼標(biāo)志(Condition Code Flags)

          N、Z、C、V均為條件碼標(biāo)志位。它們的內(nèi)容可被算術(shù)或邏輯運(yùn)算的結(jié)果所改變,并且可以決定某條指令是否被執(zhí)行。

          在ARM狀態(tài)下,絕大多數(shù)的指令都是有條件執(zhí)行的;在Thumb狀態(tài)下,僅有分支指令是有條件執(zhí)行的。條件碼標(biāo)志位的各位具體含義如表1所示。


        表1 條件碼標(biāo)志位的具體含義

          2.控制位

          PSR的低8位(包括I、F、T和M[4∶0])稱為控制位,當(dāng)發(fā)生異常時(shí)這些位可以被改變。如果處理器運(yùn)行特權(quán)模式,那么這些位也可以由程序修改。

          (1)中斷禁止位I、F。

          ·I=1,禁止IRQ中斷;

          ·F=1,禁止FIQ中斷。

          (2)T標(biāo)志位:該位反映處理器的運(yùn)行狀態(tài)。

          ·對(duì)于構(gòu)v5及以上版本的T系列處理器,當(dāng)該位為l時(shí),程序運(yùn)行于Thumb狀態(tài),否則運(yùn)行于ARM狀態(tài)。

          ·對(duì)于構(gòu)v5及以上版本的非T系列處理器,當(dāng)該位為1時(shí),執(zhí)行下一條指令以引起位定義的指令異常;當(dāng)該位為0時(shí),表示運(yùn)行于ARM狀態(tài)。

          (3)運(yùn)行模式位M[4∶0]:MO、M1、M2、M3、M4是模式位,這些位決定了處理器的運(yùn)行模式。具體含義如表2所示。圖片加載中......

        表2 運(yùn)行模式位M[4∶0]的具體含義

          由表2可知,并不是所有的運(yùn)行模式位的組合都是有效的,其他的組合結(jié)果會(huì)導(dǎo)致處理器進(jìn)入一個(gè)不可恢復(fù)的狀態(tài)。

          3.保留位

          PSR中的其余位為保留位,當(dāng)改變PSR中的條件碼標(biāo)志位或者控制位時(shí),保留位不要改變,在程序中也不要使用保留位來(lái)存儲(chǔ)數(shù)據(jù)。保留位將用于ARM版本的擴(kuò)展。

        匯編指令大全:
        一、數(shù)據(jù)傳輸指令
        ───────────────────────────────────────
        它們?cè)诖尜A器和寄存器、寄存器和輸入輸出端口之間傳送數(shù)據(jù).
        1. 通用數(shù)據(jù)傳送指令.
        MOV 傳送字或字節(jié).
        MOVSX 先符號(hào)擴(kuò)展,再傳送.
        MOVZX 先零擴(kuò)展,再傳送.
        PUSH 把字壓入堆棧.
        POP 把字彈出堆棧.
        PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧.
        POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧.
        PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆棧.
        POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆棧.
        BSWAP 交換32位寄存器里字節(jié)的順序
        XCHG 交換字或字節(jié).( 至少有一個(gè)操作數(shù)為寄存器,段寄存器不可作為操作數(shù))
        CMPXCHG 比較并交換操作數(shù).( 第二個(gè)操作數(shù)必須為累加器AL/AX/EAX )
        XADD 先交換再累加.( 結(jié)果在第一個(gè)操作數(shù)里 )
        XLAT 字節(jié)查表轉(zhuǎn)換.
        ── BX 指向一張 256 字節(jié)的表的起點(diǎn), AL 為表的索引值 (0-255,即
        0-FFH); 返回 AL 為查表結(jié)果. ( [BX+AL]->AL )
        2. 輸入輸出端口傳送指令.
        IN I/O端口輸入. ( 語(yǔ)法: IN 累加器, {端口號(hào)│DX} )
        OUT I/O端口輸出. ( 語(yǔ)法: OUT {端口號(hào)│DX},累加器 )
        輸入輸出端口由立即方式指定時(shí), 其范圍是 0-255; 由寄存器 DX 指定時(shí),
        其范圍是 0-65535.
        3. 目的地址傳送指令.
        LEA 裝入有效地址.
        例: LEA DX,string ;把偏移地址存到DX.
        LDS 傳送目標(biāo)指針,把指針內(nèi)容裝入DS.
        例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
        LES 傳送目標(biāo)指針,把指針內(nèi)容裝入ES.
        例: LES DI,string ;把段地址:偏移地址存到ES:DI.
        LFS 傳送目標(biāo)指針,把指針內(nèi)容裝入FS.
        例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
        LGS 傳送目標(biāo)指針,把指針內(nèi)容裝入GS.
        例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
        LSS 傳送目標(biāo)指針,把指針內(nèi)容裝入SS.
        例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
        4. 標(biāo)志傳送指令.
        LAHF 標(biāo)志寄存器傳送,把標(biāo)志裝入AH.
        SAHF 標(biāo)志寄存器傳送,把AH內(nèi)容裝入標(biāo)志寄存器.
        PUSHF 標(biāo)志入棧.
        POPF 標(biāo)志出棧.
        PUSHD 32位標(biāo)志入棧.
        POPD 32位標(biāo)志出棧.

        二、算術(shù)運(yùn)算指令
        ───────────────────────────────────────
          ADD 加法.
        ADC 帶進(jìn)位加法.
        INC 加 1.
        AAA 加法的ASCII碼調(diào)整.
        DAA 加法的十進(jìn)制調(diào)整.
        SUB 減法.
        SBB 帶借位減法.
        DEC 減 1.
        NEC 求反(以 0 減之).
        CMP 比較.(兩操作數(shù)作減法,僅修改標(biāo)志位,不回送結(jié)果).
        AAS 減法的ASCII碼調(diào)整.
        DAS 減法的十進(jìn)制調(diào)整.
        MUL 無(wú)符號(hào)乘法.
        IMUL 整數(shù)乘法.
        以上兩條,結(jié)果回送AH和AL(字節(jié)運(yùn)算),或DX和AX(字運(yùn)算),
        AAM 乘法的ASCII碼調(diào)整.
        DIV 無(wú)符號(hào)除法.
        IDIV 整數(shù)除法.
        以上兩條,結(jié)果回送:
        商回送AL,余數(shù)回送AH, (字節(jié)運(yùn)算);
        或 商回送AX,余數(shù)回送DX, (字運(yùn)算).
        AAD 除法的ASCII碼調(diào)整.
        CBW 字節(jié)轉(zhuǎn)換為字. (把AL中字節(jié)的符號(hào)擴(kuò)展到AH中去)
        CWD 字轉(zhuǎn)換為雙字. (把AX中的字的符號(hào)擴(kuò)展到DX中去)
        CWDE 字轉(zhuǎn)換為雙字. (把AX中的字符號(hào)擴(kuò)展到EAX中去)
        CDQ 雙字?jǐn)U展. (把EAX中的字的符號(hào)擴(kuò)展到EDX中去)

        三、邏輯運(yùn)算指令
        ───────────────────────────────────────
          AND 與運(yùn)算.
        or 或運(yùn)算.
        XOR 異或運(yùn)算.
        NOT 取反.
        TEST 測(cè)試.(兩操作數(shù)作與運(yùn)算,僅修改標(biāo)志位,不回送結(jié)果).
        SHL 邏輯左移.
        SAL 算術(shù)左移.(=SHL)
        SHR 邏輯右移.
        SAR 算術(shù)右移.(=SHR)
        ROL 循環(huán)左移.
        ROR 循環(huán)右移.
        RCL 通過(guò)進(jìn)位的循環(huán)左移.
        RCR 通過(guò)進(jìn)位的循環(huán)右移.
        以上八種移位指令,其移位次數(shù)可達(dá)255次.
        移位一次時(shí), 可直接用操作碼. 如 SHL AX,1.
        移位>1次時(shí), 則由寄存器CL給出移位次數(shù).
        如 MOV CL,04
        SHL AX,CL

        四、串指令
        ───────────────────────────────────────
         DS:SI 源串段寄存器 :源串變址.
        ES:DI 目標(biāo)串段寄存器:目標(biāo)串變址.
        CX 重復(fù)次數(shù)計(jì)數(shù)器.
        AL/AX 掃描值.
        D標(biāo)志 0表示重復(fù)操作中SI和DI應(yīng)自動(dòng)增量; 1表示應(yīng)自動(dòng)減量.
        Z標(biāo)志 用來(lái)控制掃描或比較操作的結(jié)束.
        MOVS 串傳送.
        ( MOVSB 傳送字符. MOVSW 傳送字. MOVSD 傳送雙字. )
        CMPS 串比較.
        ( CMPSB 比較字符. CMPSW 比較字. )
        SCAS 串掃描.
        把AL或AX的內(nèi)容與目標(biāo)串作比較,比較結(jié)果反映在標(biāo)志位.
        LODS 裝入串.
        把源串中的元素(字或字節(jié))逐一裝入AL或AX中.
        ( LODSB 傳送字符. LODSW 傳送字. LODSD 傳送雙字. )
        STOS 保存串.
        是LODS的逆過(guò)程.
        REP 當(dāng)CX/ECX<>0時(shí)重復(fù).
        REPE/REPZ 當(dāng)ZF=1或比較結(jié)果相等,且CX/ECX<>0時(shí)重復(fù).
        REPNE/REPNZ 當(dāng)ZF=0或比較結(jié)果不相等,且CX/ECX<>0時(shí)重復(fù).
        REPC 當(dāng)CF=1且CX/ECX<>0時(shí)重復(fù).
        REPNC 當(dāng)CF=0且CX/ECX<>0時(shí)重復(fù).

        五、程序轉(zhuǎn)移指令
        ───────────────────────────────────────
         1>無(wú)條件轉(zhuǎn)移指令 (長(zhǎng)轉(zhuǎn)移)
        JMP 無(wú)條件轉(zhuǎn)移指令
        CALL 過(guò)程調(diào)用
        RET/RETF過(guò)程返回.
        2>條件轉(zhuǎn)移指令 (短轉(zhuǎn)移,-128到+127的距離內(nèi))
        ( 當(dāng)且僅當(dāng)(SF XOR OF)=1時(shí),OP1
        JA/JNBE 不小于或不等于時(shí)轉(zhuǎn)移.
        JAE/JNB 大于或等于轉(zhuǎn)移.
        JB/JNAE 小于轉(zhuǎn)移.
        JBE/JNA 小于或等于轉(zhuǎn)移.
        以上四條,測(cè)試無(wú)符號(hào)整數(shù)運(yùn)算的結(jié)果(標(biāo)志C和Z).
        JG/JNLE 大于轉(zhuǎn)移.
        JGE/JNL 大于或等于轉(zhuǎn)移.
        JL/JNGE 小于轉(zhuǎn)移.
        JLE/JNG 小于或等于轉(zhuǎn)移.
        以上四條,測(cè)試帶符號(hào)整數(shù)運(yùn)算的結(jié)果(標(biāo)志S,O和Z).
        JE/JZ 等于轉(zhuǎn)移.
        JNE/JNZ 不等于時(shí)轉(zhuǎn)移.
        JC 有進(jìn)位時(shí)轉(zhuǎn)移.
        JNC 無(wú)進(jìn)位時(shí)轉(zhuǎn)移.
        JNO 不溢出時(shí)轉(zhuǎn)移.
        JNP/JPO 奇偶性為奇數(shù)時(shí)轉(zhuǎn)移.
        JNS 符號(hào)位為 "0" 時(shí)轉(zhuǎn)移.
        JO 溢出轉(zhuǎn)移.
        JP/JPE 奇偶性為偶數(shù)時(shí)轉(zhuǎn)移.
        JS 符號(hào)位為 "1" 時(shí)轉(zhuǎn)移.
        3>循環(huán)控制指令(短轉(zhuǎn)移)
        LOOP CX不為零時(shí)循環(huán).
        LOOPE/LOOPZ CX不為零且標(biāo)志Z=1時(shí)循環(huán).
        LOOPNE/LOOPNZ CX不為零且標(biāo)志Z=0時(shí)循環(huán).
        JCXZ CX為零時(shí)轉(zhuǎn)移.
        JECXZ ECX為零時(shí)轉(zhuǎn)移.
        4>中斷指令
        INT 中斷指令
        INTO 溢出中斷
        IRET 中斷返回
        5>處理器控制指令
        HLT 處理器暫停, 直到出現(xiàn)中斷或復(fù)位信號(hào)才繼續(xù).
        WAIT 當(dāng)芯片引線TEST為高電平時(shí)使CPU進(jìn)入等待狀態(tài).
        ESC 轉(zhuǎn)換到外處理器.
        LOCK 封鎖總線.
        NOP 空操作.
        STC 置進(jìn)位標(biāo)志位.
        CLC 清進(jìn)位標(biāo)志位.
        CMC 進(jìn)位標(biāo)志取反.
        STD 置方向標(biāo)志位.
        CLD 清方向標(biāo)志位.
        STI 置中斷允許位.
        CLI 清中斷允許位.

        六、偽指令
        ───────────────────────────────────────
        DW 定義字(2字節(jié)).
        PROC 定義過(guò)程.
        ENDP 過(guò)程結(jié)束.
        SEGMENT 定義段.
        ASSUME 建立段寄存器尋址.
        ENDS 段結(jié)束.
        END 程序結(jié)束.

        七、處理機(jī)控制指令:
        標(biāo)志處理指令 CLC(進(jìn)位位置0指令)
        CMC(進(jìn)位位求反指令)
        STC(進(jìn)位位置為1指令)
        CLD(方向標(biāo)志置1指令)
        STD(方向標(biāo)志位置1指令)
        CLI(中斷標(biāo)志置0指令)
        STI(中斷標(biāo)志置1指令)
        NOP(無(wú)操作)
        HLT(停機(jī))
        WAIT(等待)
        ESC(換碼)
        LOCK(封鎖)
        匯編指令條件嗎:
        操作碼條件碼助記符標(biāo)志含義
        0000EQZ=1相等
        0001NE(Not Equal)Z=0不相等
        0010CS/HS(Carry Set/High or Same)C=1無(wú)符號(hào)數(shù)大于或等于
        0011CC/LO(Carry Clear/LOwer)C=0無(wú)符號(hào)數(shù)小于
        0100MI(MInus)N=1負(fù)數(shù)
        0101PL(PLus)N=0正數(shù)或零
        0110VS(oVerflow set)V=1溢出
        0111VC(oVerflow clear)V=0沒(méi)有溢出
        1000HI(HIgh)C=1,Z=0無(wú)符號(hào)數(shù)大于
        1001LS(Lower or Same)C=0,Z=1無(wú)符號(hào)數(shù)小于或等于
        1010GE(Greater or Equal)N=V有符號(hào)數(shù)大于或等于
        1011LT(Less Than)N!=V有符號(hào)數(shù)小于
        1100GT(Greater Than)Z=0,N=V有符號(hào)數(shù)大于
        1101LE(Less or Equal)Z=1,N!=V有符號(hào)數(shù)小于或等于
        1110AL任何無(wú)條件執(zhí)行(默認(rèn))
        1111NV任何從不執(zhí)行



        關(guān)鍵詞: ARM體系結(jié)

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 都兰县| 临沭县| 龙门县| 孙吴县| 陈巴尔虎旗| 康定县| 城步| 武夷山市| 罗源县| 舒城县| 灵石县| 仁寿县| 团风县| 馆陶县| 通海县| 驻马店市| 缙云县| 壤塘县| 东乌珠穆沁旗| 浪卡子县| 浠水县| 绥江县| 土默特右旗| 大港区| 饶河县| 醴陵市| 广水市| 波密县| 旬邑县| 平罗县| 莫力| 乌兰浩特市| 长汀县| 云和县| 镶黄旗| 尼勒克县| 黔西县| 重庆市| 古田县| 宁城县| 夏河县|