中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

邯鄲專業(yè)做網(wǎng)站報價建設網(wǎng)站公司

邯鄲專業(yè)做網(wǎng)站報價,建設網(wǎng)站公司,WordPress影視站源碼,前程無憂網(wǎng)寧波網(wǎng)站建設類崗位目錄 考點1 嵌入式處理器的結(jié)構(gòu)類型 考點2 嵌入式處理器簡介 考點3 ARM處理器概述 考點4 處理器和處理器核 考點5 ARM 處理器的分類 考點6 經(jīng)典 ARM 處理器 考點7 ARM Cortex 嵌入式處理器 考點8 ARM Cortex實時嵌入式處理器 考點9 ARM Cortex 應用處理器 考點10 AR…

目錄

考點1 嵌入式處理器的結(jié)構(gòu)類型

考點2 嵌入式處理器簡介

考點3 ARM處理器概述

考點4? 處理器和處理器核

考點5?ARM 處理器的分類

考點6 經(jīng)典 ARM 處理器

考點7 ARM Cortex 嵌入式處理器

考點8 ARM Cortex實時嵌入式處理器

考點9 ARM Cortex 應用處理器

考點10 ARM 處理器的工作狀態(tài)及工作模式

考點11 ARM 處理器的寄存器組織

考點12 ARM處理器的異常

考點13 ARN的存儲器格式要求及數(shù)據(jù)類型

考點14 ARM 處理器中的 MMU 和 MPU

考點15 ARM 指令分類及指令格式

考點16? ARM 指令的尋址方式

考點17 ARM 指令集

考點18 Thumb 指令集

考點19 ARM 處理器支持的偽指令

考點20? ARM 匯編器所支持的偽指令

考點21 ARM匯編語言的語句格式

考點22 匯編語言的程序設計舉例

考點23?嵌入式C語言與匯編語言混合程序設計


23考綱

考點1 嵌入式處理器的結(jié)構(gòu)類型

(1)CISC處理器與 RISC 處理器
①指令集的概念
????????指令集(Instruction Set)也稱為指令系統(tǒng),內(nèi)容包括基本數(shù)據(jù)類型、寄存器、尋址模式、指令、中斷、異常處理以及外部 I0 等,它是設計處理器的主要依據(jù),常常被稱為指令集體系結(jié)構(gòu)或IS架構(gòu)(Instruction SetArchitecture, ISA).
②CISC 處理器的特點
????????指令集中指令數(shù)目很多且結(jié)構(gòu)比較復雜,它包含許多很少使用的專用指令,不同指令的長度并不相等,執(zhí)行時間也長短不一。CISC處理器結(jié)構(gòu)復雜,功耗較大。
③RISC 處理器的特點

????????指令數(shù)目較少,指令字長統(tǒng)一,格式規(guī)整,尋址模式較為單純,指令操作簡單,執(zhí)行時間短,大多能在1個周期內(nèi)完成。所有需要處理的操作數(shù)都必須經(jīng)過加載和存儲指令從存儲器取出后預先存放在寄存器。
④RISC 與 CISC 的關(guān)系
????????RISC與CISC并不是對立的,它們在競爭的過程中相互借鑒,取長補短。

(2)馮·諾依曼存儲結(jié)構(gòu)與哈佛存儲結(jié)構(gòu)
①馮·諾依曼存儲結(jié)構(gòu)與哈佛存儲結(jié)構(gòu)的區(qū)別
????????不同之處是:CPU連接程序存儲器與數(shù)據(jù)存儲器的方式不同。
②)馮·諾依曼結(jié)構(gòu)的特點
? ? ? ?CPU(運算器與控制器)與存儲器的連接只有一套總線,也就是一套數(shù)據(jù)線、控制線和地址線連接了 CPU 與存儲器,存儲器中可以存放數(shù)據(jù),也可以存放程序。馮氏結(jié)構(gòu)中數(shù)據(jù)和程序代碼共享同一地址空間,程序代碼可作為數(shù)據(jù)來處理,反之亦然,因而具有較好的靈活性。

③哈佛結(jié)構(gòu)的特點
a.使用兩個獨立的存儲器分別存儲指令和數(shù)據(jù),不允許指令和數(shù)據(jù)并存;
b.使用獨立的兩條總線,分別作為CPU與每個存儲器之間的專用通信路徑,而這兩條總線之間毫無關(guān)聯(lián)哈佛結(jié)構(gòu)的處理器其程序和數(shù)據(jù)分開組織與存儲,執(zhí)行時可以同時進行指令和數(shù)據(jù)的存取,因而具有較高的執(zhí)行效率。許多數(shù)字信號處理器和微控制器都使用哈佛結(jié)構(gòu),它們的程序代碼和數(shù)據(jù)量較小,分別存放在 Flash 和SRAM 存儲器中。
?

考點2 嵌入式處理器簡介

內(nèi)核系列推出公司內(nèi)核結(jié)構(gòu)簡單描述
51IntelCISC哈佛結(jié)構(gòu)8位字長,最早被稱為單片機。其價格低,應用資料全,開發(fā)工具便宜,開發(fā)周期短,開發(fā)成本低,被廣泛應用。
AVRAtmelRISC哈佛結(jié)構(gòu)8位、16位和32位三類字長的微控制器內(nèi)核,主要特點是高性能、高速度、低功耗。
PICMicrochipRISC哈佛結(jié)構(gòu)8位、16位和32位三類不同字長的RISC微控制器內(nèi)核。主要針對工業(yè)控制應用領(lǐng)域,應用最廣的是電機控制、汽車電子等抗干擾要求比較高的場合。PIC的主要優(yōu)勢是針對性強,特別是抗干擾能力強
MSP430TIRISC馮·諾依曼結(jié)構(gòu)16位字長的微控制器內(nèi)核,既集成了數(shù)字電路,也集成了模擬電路。廣泛應用于手持設備嵌入式應用系統(tǒng)中,突出特點就是以超低功耗著稱全球。
MIPSMIPSRISC哈佛結(jié)構(gòu)高性能、高檔次32位(MIPS32)和64位(MIPS64)處理器內(nèi)核,主要特點是適應于高速、大數(shù)據(jù)吞吐量應用場合。
PowerPCApple, IBM,MotorolaRISC哈佛結(jié)構(gòu)PowerPC是含有32位子集的64位高性能處理器內(nèi)核。具有優(yōu)異的性能、較低的能耗以及較低的散熱量。
MC68KMotorola,FreescaleRISC哈佛結(jié)構(gòu)32位字長的處理器內(nèi)核,具有超標量的超級指令流水線,性能優(yōu)勢明顯,主要應用在高端嵌入式應用領(lǐng)域
ColdFireFreescaleRISC哈佛結(jié)構(gòu)32位的高性能微控制器內(nèi)核。其性能優(yōu)越,集成度高,可應用于工業(yè)控制領(lǐng)域、消費電子領(lǐng)域、醫(yī)療電子領(lǐng)域、測試與測量領(lǐng)域等
ARMARM
RISC多數(shù)為哈佛結(jié)構(gòu)
除64位的Cortex-A50外,均為32位結(jié)構(gòu)的嵌入式處理器內(nèi)核。是全球應用最廣、知名度最高、使用廠家最多的嵌人式處理器內(nèi)核

考點3 ARM處理器概述

(1)ARM 處理器的主要特點
①單周期操作
????????ARM 指令系統(tǒng)中的指令只需要執(zhí)行簡單而基本的操作,其執(zhí)行過程在一個機器周期內(nèi)完成。

②只使用加載/存儲(Load/Store)指令訪問內(nèi)存
????????只采用加載和存儲兩種指令對存儲器進行讀和寫的操作,所有需要運算部件進行處理的操作數(shù)都必須經(jīng)過加載指令和存儲指令,從存儲器取出后預先存放到寄存器內(nèi),以加快指令的執(zhí)行速度。
③指令長度固定

????????指令格式固定為 32位長(在16位代碼的 Thumb 工作狀態(tài)除外),使指令譯碼結(jié)構(gòu)簡單,效率提高。

④三地址指令格式
????????采用三地址指令格式(Thumb指令為二地址)、較多寄存器和對稱的指令格式便于編譯器生成優(yōu)化的代碼。

⑤指令流水線技術(shù)
????????ARM 采用多級流水線技術(shù)(3級~13級),以提高指令執(zhí)行的效率。

⑥)低功耗設計
????????ARM 處理器架構(gòu)簡單,有利于高效并且極其簡單地實現(xiàn),門電路數(shù)目大大減少。此外,它還采取硬件性能監(jiān)視、動態(tài)時鐘控制、動態(tài)電壓調(diào)節(jié)、省電模式等多種節(jié)能措施,主流 ARM 為 32位處理器。主要特點有耗電省、功能強、成本低、32位和16位指令集并存。

(2)ARM處理器指令集的比較
????????除Cortex-M之外,其他ARM 處理器都有 ARM指令集和 Thumb/Thumb-2兩套指令集,這兩套指令集都是逐步擴展的,高版本處理器與低版本處理器保持向下基本兼容(注:v8架構(gòu)的處理器還有64位的A64指令集)。

①ARM 指令集
????????ARM 指令集全部是 32 位的指令,其基本指令主要用于進行8位、16位和 32 位整數(shù)的運算,通過擴展的協(xié)處理器(最多16個),可以擴充浮點運算指令、數(shù)字信號處理(DSP)指令、單指令多數(shù)據(jù)(SIMD)指令等。

②)Thumb 指令集
????????Thumb 全部是 16 位字長的指令,可以看作是 ARM 指令的壓縮形式。它是為減少代碼量而設計的,因為較短的指令整體上可以有更高的代碼密度。Thumb 指令集并不完備,它只支持通用功能,必要時仍需要使用 ARM指令。
③Thumb-2 指令集

????????Thumb-2指令集既有 16 位指令又有 32位指令,是一個混合的指令集。它是 16位 Thumb 指令集的超集,功能強大、完備,效率高。由于 Thumb-2 同時支持 16位和 32 位指令,因而無須像 Thumb 指令那樣麻煩地在 Thumb狀態(tài)和 ARM 狀態(tài)之間來回切換處理器的工作狀態(tài)。
?

考點4? 處理器和處理器核

(1)處理器核
????????“處理器核”特指實現(xiàn)某種版本 ARM 指令集架構(gòu)、具有取指令和執(zhí)行指令功能的組件。
(2)處理器
????????以處理器核為中心,再把存儲管理部件 MM、中斷控制器、浮點運算器、總線接口等組件進行集成就構(gòu)成“ARM 處理器”。
????????ARM 處理器中一定包含有一個或幾個處理器核,而單純的處理器核也可以作為處理器使用。

考點5?ARM 處理器的分類

ARM 處理器分為五類:

????????經(jīng)典 ARM處理器、ARM Cortex嵌入式處理器、ARM Cortex 實時嵌入式處理器ARM Cortex應用處理器以及ARM專家處理器

ARM Cortex 處理器包括:

(1)Cortex-A(A=Application)系列是面向高端應用的處理器,它的工作頻率高、性能好、功耗合理。A5~A15為32位,而 A53-A57為64位版本。

(2)Cortex-R(R=RealTime)系列是面向?qū)崟r控制應用的處理器,響應速度快、性能合理、功耗低。
(3)Cortex-M(M=Microcontroller)系列是面向微控制器的處理器,性價比極高、成本很低、功耗極小。

考點6 經(jīng)典 ARM 處理器


????????經(jīng)典 ARM 處理器目前主要有ARM7、ARM9和ARM11三個系列,包含多種不同的處理器,它們大多是按照ARM4T、ARMV5TE或ARMv6架構(gòu)設計的。
(1)ARM7 系列
????????ARM7系列的 ARM7TDMI(ARM7TDMS-S)是市場上銷量最高的32位處理器內(nèi)核,它采用ARMv4T架構(gòu),支持 ARMThumb指令集,使用馮氏存儲結(jié)構(gòu),由3級指令流水線實現(xiàn)
(2)ARM9系列
????????ARM920T 處理器使用的核是ARM9TDMI,它基于ARMv4T架構(gòu)設計,支持ARM/Thumb 指令集,具有快速乘法器;采用程序與數(shù)據(jù)分離的哈佛存儲結(jié)構(gòu),指令Cache和數(shù)據(jù) Cache各 16KB,還可通過總線外接 Cache和 SRAM 存儲器;支持協(xié)處理器:含有內(nèi)嵌的在線仿真模塊ICE、支持片上調(diào)試:采用5級流水線以提高處理器性能,每一條指令的執(zhí)行分為5個步驟:①取指令,②指令譯碼,③執(zhí)行指令運算,④Cache/存儲器訪問,⑤結(jié)果寫回寄存器。

考點7 ARM Cortex 嵌入式處理器


(1)Cortex-M的介紹
????????Cortex-M 系列目前包括 Cortex-M0/M0+/M1/M3/M4共5款處理器。它們保持向上兼容,具有高能效、易使用的特點,能以低成本提供豐富的功能,適用于對成本和功耗敏感的微控制器(MCU)和終端應用。Cortex-M 處理器都是 32位的 RISC 處理器,采用流水線技術(shù),它只支持 Thumb-2指令集的子集。
(2)Cortex-M0(CM0)
①Cortex-M0(CM0)的特點
????????ARM Cortex-M0 處理器是現(xiàn)有的體積最小、能耗最低的 ARM 處理器。CM0的處理器核基于ARMV6M架構(gòu)(是ARM7M架構(gòu)的子集),它僅有56條Thumb-2指令,用戶很容易掌握,開發(fā)比較簡單。它采用馮氏存儲結(jié)構(gòu)、3級流水線技術(shù),可配置硬件乘法器,確定的指令執(zhí)行時間和中斷計時使得很容易計算出事件響應時間。
②Cortex-M0(CM0)的結(jié)構(gòu)CM0處理器的結(jié)構(gòu)如圖 2-6所示。其中,WIC(Wake-up Interrupt Controller)為喚醒中斷控制器,NVIC(Nestedvector Intermupt Controller)為嵌套向量中斷控制器。32位的 AMBA-3AHB-Lite 系統(tǒng)總線提供了與外部組件和存諸器的簡單接口。

(3)Cortex-M3(CM3)
????????CM3處理器系列的低功耗、低成本和易于使用的優(yōu)點相結(jié)合。它采用的處理器核是基于 ARMV7-M 架構(gòu),使用哈佛存儲結(jié)構(gòu)和3級流水線實現(xiàn),支持 Thumb-2指令集的子集,有硬件除法指令。

①總線矩陣和嵌套向量中斷控制器
????????與處理器核集成在一起的是總線矩陣和嵌套向量中斷控制器(NVC),前者提供了3條AHB-Lite 總線,分別用于連接指令存儲器、數(shù)據(jù)存儲器和作為系統(tǒng)總線。嵌套向量中斷控制器(NVIC)最多能提供240個物理中斷、1個不可屏蔽中斷(NMI)和各種系統(tǒng)異常,每一個中斷都分配一個中斷優(yōu)先級(共 256個優(yōu)先級),可動態(tài)調(diào)整。NVIC 可支持嵌套中斷,處理中斷時,程序計數(shù)器、程序狀態(tài)寄存器、鏈接寄存器和通用寄存器自動壓入堆棧,中斷處理完成后再由硬件自動恢復這些寄存器的內(nèi)容,無須任何軟件干預。?
②M3 的特點

????????Cortex-M3 處理器集成度高、芯片空間使用合理、低成本、低功耗,是專業(yè)嵌入式應用很好的選擇

③CM4 和CM3的區(qū)別
????????CM4比CM3多一個VFP可選部件,具有數(shù)字信號處理能力。

考點8 ARM Cortex實時嵌入式處理器


(1)Cortex-R 的介紹。
????????Cortex-R屬于中檔處理器,它提供的性能比 Cortex-M系列高得多,而 Cortex-A 系列則性能更高,專用于需要運行復雜操作系統(tǒng)的面向用戶的應用。Cortex-R處理器系列有 Cortex-R4、Cortex-R5和 Cortex-R7等品種,適用于計算復雜、實時性要求苛刻的領(lǐng)域。
(2)Cortex-R的主要特點
①高性能
????????采用多級流水線結(jié)構(gòu),時鐘頻率較高,具有高性能DSP和硬件 SIMD,可快速執(zhí)行復雜代碼和數(shù)字信號處理功能。
②)實時處理
????????中斷響應快,片內(nèi)緊耦合存儲器(Tightly Coupled Memory,TCM)能快速存取代碼/數(shù)據(jù),給實時系統(tǒng)的響應速度和高吞吐量的操作提供了保障。
③安全
????????內(nèi)存保護單元(MPU)支持用戶模式和授權(quán)軟件模式,存儲器和總線采用錯誤檢測與糾正(Error CorrectingCode,ECC)技術(shù),可雙內(nèi)核幾余配置,保證系統(tǒng)運行可靠。
④低成本
????????通過配置/排除某些功能使能效和芯片面積/成本效益最佳,調(diào)試斷點和檢測點可進行快速開發(fā)和測試,加快上市速度和可定制功能。
(3)Cortex-R的結(jié)構(gòu)
????????以Codex-R4為例,其核心是采用ARMV7-R架構(gòu)的處理器核 ARMR4,它支持ARM/Thumb-2指令集,代碼密度高;使用硬件實現(xiàn)單指令多數(shù)據(jù)(SingleInstruction Multiple Data,SIMD)的DSP指令;具有可選的浮點運算器(處理器型號為Cortex-R4F);使用8級流水線技術(shù)實現(xiàn)。

考點9 ARM Cortex 應用處理器


(1)Cortex-A 的應用領(lǐng)域
????????Cortex-A處理器系列適用于有高計算要求、需運行功能豐富的操作系統(tǒng)以及要求提供交互媒體和圖形顯示的應用領(lǐng)域。
(2)Cortex-A 處理器的架構(gòu)

????????Cortex-A處理器除了A50系列為64位字長,采用ARMV8A 架構(gòu)外,其他均為32 位字長,包括Corex-A17/A15/A12/A9/A8/A7/A5處理器,它們使用基于ARMV7A架構(gòu)的處理器核,支持傳統(tǒng)的 ARM、Thumb指令集和高性能緊湊型 Thumb-2EE指令集,具有完全的應用兼容性;提供Java 字節(jié)碼加速執(zhí)行的Jazelle 技術(shù),提供可信計算的 Trust Zone 安全擴展;采用最多可達13級的深度流水線技術(shù),處理器時鐘頻率可達2GHz 左右;Codex-A處理器中都集成了浮點運算器VFP,提供了高性能的單精度和雙精度浮點運算:集成了多媒體處理引擎 NEON,提供了對于高級 SIMD指令的支持:包含有分開的指令Cache和數(shù)據(jù)Cache(有些還包含二級 Cache),實現(xiàn)了哈佛存儲結(jié)構(gòu)。有些處理器還支持 ARMV7A 架構(gòu)的擴展,支持更大的物理地址訪問、硬件虛擬化和 128位的 AMBA4 ACE 總線。

? ? ? ??

考點10 ARM 處理器的工作狀態(tài)及工作模式

(1)ARM 處理器工作狀態(tài)及其切換
????????在 ARM的體系結(jié)構(gòu)中,處理器可以工作在3種不同的狀態(tài),一是 ARM 狀態(tài),二是Thumb 狀態(tài)及 Thumb-2狀態(tài),三是調(diào)試狀態(tài)。
①ARM 狀態(tài)
????????ARM 狀態(tài)是 ARM 處理器工作于32位指令的狀態(tài),即32位狀態(tài),所有指令均為32位寬度
②Thumb 狀態(tài)
????????Thumb 狀態(tài)是 ARM 執(zhí)行 16 位指令的狀態(tài),即 16 位狀態(tài)。在 Thumb 模式下,指令代碼只有 16 位,使代碼密度變大,占用內(nèi)存空間減小,提供比32位程序代碼更佳的效能。但在有些情況下如異常處理時必須執(zhí)行 32位 ARM 狀態(tài)下的 ARM 指令,如果原來工作于 Thumb 狀態(tài),必須將其切換到 ARM 狀態(tài)。
對于具有 Thumb-2指令集的處理器,Thumb 狀態(tài)就是運行 Thumb-2指令的工作狀態(tài)
a.除 Cortex_M 系列處理器外,所有 ARM 處理器復位后開始執(zhí)行代碼時總是只處于 ARM 狀態(tài)。如果需要則可通過下面的方法切換到 Thumb 狀態(tài)。
b.Cortex-M 處理器因為只有 Thumb-2指令集,所以只有 Thumb 狀態(tài)和調(diào)試狀態(tài)兩種。
③調(diào)試狀態(tài)
????????處理器停機調(diào)試時進入調(diào)試狀態(tài)。
④ARM與Thumb 間的切換
a.由ARM 狀態(tài)切換到 Thumb 狀態(tài)
????????通過 BX指令,將操作數(shù)寄存器的最低位設置為1即可將 ARM 狀態(tài)切換到 Thumb 狀態(tài)。如果 RO[0]=1,則執(zhí)行 BX R0 指令將進入 Thumb 狀態(tài)。
????????如果 Thumb 狀態(tài)進入異常處理(異常處理要在 ARM 狀態(tài)下進行),則當異常返回時,將自動切換到 Thumb狀態(tài)。
b.由 Thumb 狀態(tài)切換到 ARM 狀態(tài)。
????????通過 BX指令,將操作數(shù)寄存器的最低位置為0即可將 Thumb 狀態(tài)切換到 ARM 狀態(tài)。如果 RO[0]=0,則執(zhí)行 BX R0 指令將進入 ARM 狀態(tài)。
????????當處理器進行異常處理時,則從異常向量地址開始執(zhí)行,將自動進入ARM 狀態(tài)。

(2)RAM 處理器的工作模式
????????體系結(jié)構(gòu)(除Cortex 外)支持7種工作模式,取決于當前程序狀態(tài)寄存器CPSR的低5位的值。

工作模式功能說明可訪問的寄存器CPSR 「M4:MO]
用戶模式 User程序正常執(zhí)行工作模式PC,R14~RO,CPSR10000
快速中斷模式FQ處理高速中斷,用于高速數(shù)據(jù)傳輸或通道處理PC,R14_fiq~R8_fiq,R7~RO,CPSR,SPSR_fiq10001
外部中斷模式IRO用于普通中斷處理PC,R14_irq~R13_irq,R12~RO,CPSR,SPSR_irg10010
管理模式SVC操作系統(tǒng)的保護模式,處理軟中斷SWIPC,R14_svc~R13_svc,R12~RO,CPSR,PSR_svc10011
中止模式ABT處理存儲器故障,實現(xiàn)虛擬存儲器和存儲器保護PC,R14 abt~R13 abt,
R12~RO,CPSR,SPSR abt
10111
未定義指令模式UND處理未定義的指令陷阱,用于支持硬件協(xié)處理器仿真PC,R14_und~R13_und,R12~RO,CPSR,SPSR_ und11011
系統(tǒng)模式SYS運行特權(quán)級的操作系統(tǒng)任務PC,R14~RO,CPSR11111

????????ARM 處理器工作模式間可以相互轉(zhuǎn)換,但是是有條件的。當處理器工作于用戶模式時,除非發(fā)生異常,否則將不能改變工作模式。當發(fā)生異常時,處理器自動改變 CPSR[M4∶M0]的值,進入相應的工作模式。


考點11 ARM 處理器的寄存器組織


(1)ARM 狀態(tài)下的寄存器組織

????????ARM 處理器共有37個寄存器,包括31個通用寄存器(含PC)和6個狀態(tài)寄存器。工作于ARM狀態(tài)下,在物理分配上寄存器被安排成部分重疊的組,每種處理器工作模式使用不同的寄存器不同模式下的寄存器組如圖所示。

ARM 處理器工作在不同模式時使用的寄存器有所不同,但其共同點是:

一是無論何種模式,R15均作為PC使用;

二是CPSR為當前程序狀態(tài)寄存器:

三是R0~R7為公用的通用寄存器。

不同之處在于高端7個通用寄存器和狀態(tài)寄存器在不同模式下不同。
①通用寄存器
????????通用寄存器中不分組的寄存器共8個:RO~R7:R8~R12共2組計10個寄存器,標有fq的寄存器代表快速中斷模式專用,與其他模式地址重疊但寄存器內(nèi)容并不沖突;R13~R14除了用戶模式和系統(tǒng)模式分別為堆棧指針(Stack Pointer,SP)和程序鏈接寄存器(Linkregister,LR)之外,其他模式下均有自己獨特的標記方式,是專門用于特定模式的寄存器,共6組計12個。加上作為PC的R15,這樣通用寄存器共31個。所有通用寄存器均為 32 位結(jié)構(gòu)。
②狀態(tài)寄存器
????????狀態(tài)寄存器共6個,除了共用的當前程序狀態(tài)寄存器CPSR外還有分組的備份程序狀態(tài)寄存器SPSR(5組共5個)。程序狀態(tài)寄存器的格式如圖所示。
圖中條件碼標志有4個,為N、Z、C和V,Q標志以及8個控制位為I、F、T、M4~MO。

a.條件碼標志含義
????????N為符號標志,N=1表示運算結(jié)果為負數(shù),N=0表示運算結(jié)果為正數(shù),Z為全0標志,運算結(jié)果為0,則Z=1,否則Z=0。
????????C為進借位標志,加法有進位時C=1,無進位時 C=0:減法有借位時C=0,無借位時 C=1。要注意這里的減法借位標志與x86等常規(guī)定義有區(qū)別。
????????V為溢出標志,加減法運算結(jié)果有溢出時V=1,否則V=0。
????????Q 為增強的 DSP 運算指令是否溢出的標志,溢出時 Q=1,否則 Q=0。
b.控制位含義
????????I為中斷禁止控制位,I=1禁止外部IRQ 中斷,I=0 允許 IRQ 中斷。
????????F為禁止快速中斷 FIQ 的控制位,F=1 禁止 FQ 中斷,F=0 允許 FIQ 中斷。
????????T為 ARM與Thumb指令切換,T=1 時執(zhí)行 Thumb 指令,否則執(zhí)行 ARM 指令。應注意的是,對于不具備Thumb 指令的處理器,T=1時表示強制下一條執(zhí)行的指令產(chǎn)生未定義的指令中斷。

????????M4~M0為模式選擇位,決定處理器工作于何種模式。
????????CPSR 狀態(tài)寄存器可分為4個域:標志域F(31:24)、狀態(tài)域S(23:16)、擴展域X(15:8)和控制域C(7:0)。使用單字節(jié)的傳送操作可以單獨訪問這4個域中的任何一個,如CPSRC、CPSRF,這樣可以僅對這個域操作而不影響其他位。
(2)Thumb 狀態(tài)下的寄存器組織
????????Thumb狀態(tài)下的寄存器組是ARM狀態(tài)下寄存器組的子集,Thumb/Thumb2狀態(tài)下的寄存器組如圖所示。

????????高位寄存器R8~R12在 Thumb 狀態(tài)下不可見,即不能直接作為通用寄存器使用,而在Thumb-2下可以使用,即R8~R12只有在32位指令狀態(tài)下才可當作通用寄存器使用。
(3)帶MMU的ARM 處理器中的控制寄存器
????????對于內(nèi)置 MMU的 ARM 處理器,存儲管理涉及虛擬存儲技術(shù),采用相關(guān)頁表的技術(shù)來訪問內(nèi)存,其控制寄存器為 CP15,由它控制 C0~C15共16個系統(tǒng)控制寄存器,每個寄存器包括若干非常復雜的操作功能。

考點12 ARM處理器的異常

(1)異常的定義
????????異常(Exceptions)是由于內(nèi)部事件或外部事件引起的請求,使處理器去做相應處理的事件。當發(fā)生異常時,系統(tǒng)執(zhí)行完當前指令后,跳轉(zhuǎn)到相應的異常處理程序入口執(zhí)行異常處理,異常處理完畢后程序返回。
(2)ARM異常種類、異常向量表及優(yōu)先級
①ARM 異常種類
????????在 ARM 體系結(jié)構(gòu)(除 Codex 外)中,異常用來處理軟中斷、未定義指令陷阱、系統(tǒng)復位及外部中斷。共有7種不同類型的異常,它們的優(yōu)先級及其對應的向量地址如表所示。

②ARM 異常向量
????????異常向量的地址由 32位地址空間的低端正常地址范圍0x00000000-0x0000001F決定。 ARM 處理器片內(nèi)其他硬件組件的中斷使用 IRO 或 YIQ。
③ARM 異常的優(yōu)先級
????????7種類型的異常分成6級,級別最高的是復位,最低的是未定義的指令UND或軟件中斷SWI。其中 UND和 SWI異常(包括協(xié)處理器不存在異常)是互斥的,不可能同時發(fā)生,因此優(yōu)先級是相同的,并不矛盾。復位異常的優(yōu)先級最高,因此在任何情況下只要進入復位狀態(tài),系統(tǒng)便無條件地將PC指向0x00000000處去執(zhí)行系統(tǒng)的第一條指令。通常此處放一條無條件的轉(zhuǎn)移指令,轉(zhuǎn)移到系統(tǒng)初始化程序處。
(3)ARM異常的中斷響應過程
????????發(fā)生異常后,除了復位異常立即中止當前指令之外,其余情況都是處理器完成當前指令后才去執(zhí)行異常處理程序。ARM處理器對異常的響應過程如下:
①將 CPSR 的值保存到將要執(zhí)行的異常中斷對應的各自 SPSR 中,以實現(xiàn)對處理器當前狀態(tài)、中斷屏蔽及各標志位的保護。
②設置當前狀態(tài)寄存器 CPSR的相應位:設置CPSR中的M4~M0的5個位,進入相應工作模式,設置I=1禁止IRO 中斷,如果進入復位模式或FIQ 模式,還要設置F=1以禁止 FIQ 中斷。
③將引起異常指令的下一條地址(斷點地址)保存到新的異常工作模式的LR(R14)中,使異常處理程序執(zhí)行完后能正確返回原來的程序處繼續(xù)向下執(zhí)行。

④給程序計數(shù)器 PC強制賦值,轉(zhuǎn)入由表 2-4所示的向量地址,以便執(zhí)行相應的處理程序。每種異常模式對應兩個寄存器SP(R13_mode)和LR(R14_mode),mode為SVC、irg、und、fiq 或 abt之分別存放堆棧指針和斷點地址。

(4)從異常處理程序中返回
復位異常處理程序執(zhí)行完無需返回。其他所有異常處理完畢后必須返回到原來程序處繼續(xù)向下執(zhí)行。

返回步驟:
a.恢復原來被保護的用戶寄存器。
b.將 SPSR-mode 寄存器值復制到 CPSR 中,使得原先的 CPSR 狀態(tài)從相應的 SPSR 中恢復,以恢復被中斷的程序工作狀態(tài)。
c.根據(jù)異常類型將PC值恢復成斷點地址,以繼續(xù)執(zhí)行用戶原來運行著的程序。
d.清除CPSR 中的中斷禁止標志I和F,開放外部中斷IRO 和快速中斷 FIO。
應該注意的是,程序狀態(tài)字及斷點地址的恢復必須同時進行。
?

考點13 ARN的存儲器格式要求及數(shù)據(jù)類型

(1)ARM的兩種存儲字的格式
①大端模式
???????32 位數(shù)據(jù)字的高字節(jié)存儲在低地址中,而數(shù)據(jù)字的低字節(jié)則存放在高地址中。

②小端模式
????????與大端模式存儲數(shù)據(jù)完全不同,在小端模式下,32位數(shù)據(jù)字的高字節(jié)存放在高地址,而低字節(jié)存放在低地址。

系統(tǒng)復位時一般自動默認為小端模式。

(2)ARM存儲器的數(shù)據(jù)類型
①6 種數(shù)據(jù)類型

????????除 Cortex-A50 外,32位 ARM 處理器中支持字節(jié)(8位)、半字(16位)、字(32位)3 種數(shù)據(jù)類型,其中字需要4字節(jié)對齊(地址的低兩位為0),半字需要2字節(jié)對齊(地址的最低位為 0)。其中每一種又支持有符號數(shù)和無符號數(shù),因此認為共有6種數(shù)據(jù)類型。
②邊界對齊

????????ARM 微處理器的指令長度可以是32位(在ARM狀態(tài)下),也可以為16位(在Thumb 狀態(tài)下)。
③其他數(shù)據(jù)類型
????????ARM 還支持其他類型的數(shù)據(jù),如浮點數(shù)等數(shù)據(jù)類型等。

考點14 ARM 處理器中的 MMU 和 MPU


(1)ARM處理器中的MMU
①虛擬存儲器技術(shù)
????????借助于 ARM 處理器中的MMU部件,能把系統(tǒng)中不同類型的存儲器(如Fash、SRAM、SDRAM、ROM、優(yōu)盤等)進行統(tǒng)一管理,通過地址映射,使需要運行在連續(xù)地址空間的軟件可運行在不連續(xù)的物理存儲器中,需要較大存儲空間的軟件可以運行在較小容量的物理存儲器中,這就是虛擬存儲器技術(shù)。使用虛擬存儲器的另一個優(yōu)點是,它還提供了對存儲器的存取保護,在多任務系統(tǒng)中這些都是非常重要的。
②)MMU 的功能
a.虛擬地址到物理地址映射
????????ARM 中 MMU 功能可以被“禁止”或“使能”。當“使能”MMU后,ARM 處理器產(chǎn)生的地址是虛擬地址。虛擬地址空間分成若干大小固定的塊,稱為頁,物理地址空間也劃分為同樣大小的頁。
MMU的功能就是進行虛擬地址到物理地址的轉(zhuǎn)換,這需要通過查找頁表來完成。頁表是一張?zhí)摂M地址與物理地址的對應表,頁表存儲在內(nèi)存儲器中。在ARM 系統(tǒng)中,使用協(xié)處理器CP15中的寄存器C2保存頁表在內(nèi)存中的起始地址(基地址)。從虛擬地址到物理地址的映射關(guān)系示意如圖所示。


b.存儲器訪問權(quán)限控制
????????存儲器的訪問權(quán)限可以以塊(頁)為單位進行設置,分為不可訪問、只讀、可讀/寫等不同的權(quán)限。當訪問具有不可訪問權(quán)限的頁時,會產(chǎn)生一個存儲器異常的信號通知ARM 處理器。
③存儲器訪問的順序

????????當執(zhí)行加載/存儲指令要訪問存儲器時,MMU 先查找 TLB 中的轉(zhuǎn)換表。如果 TLB 中沒有,則硬件會自動查找主存儲器內(nèi)的頁表,找到虛擬地址到物理地址的轉(zhuǎn)換信息和訪問權(quán)限信息就可以用來進行存儲器的讀/寫操作,同時把這些信息放入 TLB 中供此后繼續(xù)使用。如果在頁表中也找不到轉(zhuǎn)換信息,則產(chǎn)生中斷,通知 OS 進行處理。
④TLB 中信息的用途

a.訪問權(quán)限控制信息用來控制訪問是否被允許。
b.對沒有高速緩存(指令Cache和數(shù)據(jù)Cache)的系統(tǒng),裝換得到的物理地址將被用作訪問主存器的地址。

(2)ARM處理器中的MPU
①簡介
????????存儲器保護單元(MPU)是對存儲器進行保護的可選組件。它提供了簡單替代 MMU 的方法來管理存儲器
②)MPU 的域

????????MPU允許 ARM 處理器的4GB的地址空間定義8對域,分別控制8個指令和8個數(shù)據(jù)內(nèi)存區(qū)域。每個域的首地址和界(或長度)均可編程。MPU中一個區(qū)域是一些屬性值及其對應的一片內(nèi)存。這些屬性包括起始地址、長度、讀/寫權(quán)限緩存等。帶 MPU的 ARM 處理器使用不同的域來管理和控制指令內(nèi)存和數(shù)據(jù)內(nèi)存。域和域可以重疊并且可以設置不同的優(yōu)先級,域的起始地址必須是其大小的整數(shù)倍。域的大小可以是4KB到4GB之間任意一個2的指數(shù)。

考點15 ARM 指令分類及指令格式


????????ARM 指令集使用標準的、固定長度的 32位指令格式,所有 ARM 指令都使用4位的條件編碼來決定指令是否執(zhí)行,以解決指令執(zhí)行的條件判斷。
(1)ARM 指令分類

????????ARM 微處理器的指令集可以分為分支指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(CPSR)處理指令、加載/存儲指令、協(xié)處理器指令和異常產(chǎn)生指令六大類。

(2)ARM 指令格式
①指令一般格式

<opcode>{<cond>}{S}  <Rd>,<Rn>{,<op2>}

????????其中<>為不可省,{}為可省略,opcode、cond 與S之間沒有分隔符,{S)與 Rd之間用空格隔開。格式中具體項目的含義如表所示。

關(guān)于#imm8m的說明:
a.對于 ARM 指令集,#imm8m表示一個由8位立即數(shù)經(jīng)循環(huán)右移任意偶數(shù)位次形成的 32 位操作數(shù)。

b.對于 Thumb指令集,#imm8m表示一個由8位立即數(shù)經(jīng)左移任意位次形成的 32 位操作數(shù)。

②指令的條件域
????????在 ARM 狀態(tài)時,幾乎所有的指令均根據(jù) CPSR 中條件碼的狀態(tài)和指令的條件域有條件地執(zhí)行。當指令的執(zhí)行滿足條件時,指令被執(zhí)行,否則指令被忽略。
????????每一條 ARM 指令包含4位的條件碼,位于指令的最高4位[31:28]。條件碼共有16種,每種條件碼可用兩個字符表示,這兩個字符可以添加在指令助記符的后面與指令同時使用。
????????在16種條件碼中,只有15種可以使用,如表 所示,第16種(1111)為系統(tǒng)保留,暫時不能使用。通常使用CMP指令產(chǎn)生條件標志。

(3)ARM指令中操作數(shù)符號
①“#”? ?立即數(shù)符號,其后是十進制數(shù)或十六進制數(shù)。

②“0x”? 十六進制符號,“0x”后面的數(shù)據(jù)(每位可以是 0~9、A~F)表示十六進制數(shù)。
③“!”? ?更新基址寄存器符號,“!”符號表示指令在完成操作后最后的地址應該寫入基址寄存器中。
④)“^”? 復制 SPSR 到CPSR 符號,“^”符號用于批量數(shù)據(jù)存儲指令中放在寄存器之后作為后綴,當其前面的寄存器不包含PC時,該符號表示所用的寄存器是用戶模式的寄存器:當其前面的寄存器包含PC時,該符號指示將SPSR寄存器的值復制到CPSR寄存器中。
⑤“_”? ?指示寄存器列表范圍符號,在有些指令中,表示多個連續(xù)寄存器(寄存器列表).

(4)ARM指令中的移位操作符
①移位操作的使用限制
????????移位操作在 ARM 指令集中不作為單獨的指令使用,它只能在指令格式中作為一個字段,在匯編語言中表示為指令中的選項。
②移位操作的類型
?移位操作包括如下6種類型:

????????LSL(邏輯左移)、ASL(算術(shù)左移)、LSR(邏輯右移)、ASR(算術(shù)右移)ROR(循環(huán)右移)以及RRX(帶擴展的循環(huán)右移)。

③通用寄存器進行移位操作的格式

Rm,<opsh>#<shift>

????????其中,Rm為要移位的通用寄存器;<opsh>為移位操作符,包括LSL、ASL、LSR、ASR、ROR及RRX;<shif>為移位次數(shù)(0~31)。

考點16? ARM 指令的尋址方式

(1)立即尋址
????????立即尋址也稱立即數(shù)尋址,操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù)。這個操作數(shù)被稱為立即數(shù)。如以下指令:

MOV RO,#0x12                                                   ;RO=0x12
ADC RO,RO,#100                                                 ;RO←RO+100+C

(2)寄存器尋址
????????寄存器尋址就是利用寄存器中的數(shù)值作為操作數(shù)。如以下指今:

ADD RO,R1,R2                                                      ;RO←R1+R2

????????該指令的執(zhí)行效果是將寄存器R1和R2的內(nèi)容相加,其結(jié)果存放在寄存器RO中。

(3)寄存器間接尋址
????????寄存器間接尋址就是以寄存器中的值作為操作數(shù)地址,而操作數(shù)本身存放在存儲器中。用于間接尋址的寄存器必須用П括起來。如以下指令:

LDR RS,[R4]                                    ;R5←[R4],間接尋址的寄存器是R4
STR RI,[R2]                                    ;[R2]-R1,間接尋址的寄存器是R2

第1條指令是將以R4的值為地址的存儲器中的數(shù)據(jù)傳送到R5中。第2條指令是將R1的值傳送到以R2的值為地址的存儲器中。

(4)基址加變址尋址基址加變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元。采用變址尋址方式的指令常見的有如下幾種形式:

LDR RO,[R1,#4]                                                ;RO←[R1+4]

????????將寄存器R1的內(nèi)容自動增加 4,形成操作數(shù)的有效地址,從中取得 32位操作數(shù)存入寄存器 RO中。

STR RI,[R2, #8]                                                 ;[R2+8]←R1

????????將寄存器RI的32位操作數(shù)存儲到R2+8指示地址開始的存儲區(qū)域中。

LDR RO,[R1,#4]!                                        ;RO←[R1+4]、R1←R1+4

????????將寄存器 R的內(nèi)容自動增加4形成操作數(shù)的有效地址,從中取得32位操作數(shù)存入寄存器RO中,然后R1的內(nèi)容自增4。符號“!”表示指令在完成數(shù)據(jù)傳送后應該更新基址寄存器。

LDR RO,[R1],#4                                         ;RO←[R1]、R1←R1+4

????????以寄存器R1的內(nèi)容作為操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器RO中,然后R1的內(nèi)容自動增加 4。

LDR RO,[R1.R2]                                          ;RO←[R1+R2]

????????將寄存器R1的內(nèi)容加上寄存器R2的內(nèi)容形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器 RO中。

STR RO,「RI. R2]                                         ;[R1+R2]←RO

????????將寄存器RO的內(nèi)容存儲到由R1+R2指示的有效地址對應的存儲單元中。

(5)相對尋址
????????相對尋址以程序計數(shù)器 PC的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。

	BL Subrouhtine_A	 ;跳轉(zhuǎn)到子程序Subrouhtine_A處執(zhí)行...
Subrouhtine_A...MOV PC,LR			;從子程序返回

(6)堆棧尋址
????????堆棧指針是一個專用寄存器,用來指示當前的操作位置,堆指針總是指向棧頂。當堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為滿堆棧(Ful Stack),而當堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時,稱為空堆棧(EmptyStack)。
當堆棧由低地址向高地址生成時,稱為遞增堆棧:當堆由高地址向低地址生成時,稱為遞減堆棧。①滿遞增堆棧
堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。

②滿遞減堆棧
堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成。

③空遞增堆棧
堆棧指針指向下一個將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成。

④空遞減堆棧
堆棧指針指向下一個將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。

(7)塊拷貝尋址
????????塊拷貝尋址又稱多寄存器尋址,采用多寄存器尋址方式,一條指令可以完成多個寄存器值的傳送。這種尋址方式可以用一條指令完成傳送最多16個通用寄存器的值。如以下指令:

LDMIA R0,[R1,R2,R5,R9]	  ;R1 ← [R0]、R2 ← [R0+4]、R5 ← [R0+8]、R9 ← [R0+12]

考點17 ARM 指令集


(1)數(shù)據(jù)處理類指令
①數(shù)據(jù)處理類指令的分類
a.數(shù)據(jù)傳送指令
????????用于在寄存器和存儲器之間進行數(shù)據(jù)的雙向傳輸:
b.算術(shù)邏輯運算指令
????????完成常用的算術(shù)與邏輯的運算,該類指令不但將運算結(jié)果保存在目的寄存器中,同時更新CPSR 的相應條件標志位:
c.比較指令
????????不保存運算結(jié)果,只更新CPSR中相應的條件標志位。
②)數(shù)據(jù)處理類指令

(2)程序狀態(tài)寄存器訪問指令
①程序狀態(tài)寄存器訪問指令的作用
????????程序狀態(tài)寄存器訪問指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。

②)MRS--程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令

格式:MRS{cond}Rd,<PSR>  ;PSR可以是CPSR或SPSR

????????用途:MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下情況:
a.當需要改變程序狀態(tài)寄存器的內(nèi)容時,可用 MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。
b.當在異常處理或進程切換時,需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。
③MSR--通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令

格式:MSR{cond}<PSR>_<fields>,Rm:PSR可以是CPSR或SPSR,fields為域

????????用途:MSR 指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存器或立即數(shù)。<felds>域用于設置程序狀態(tài)寄存器中需要操作的位,32位的程序狀態(tài)寄存器可分為4個域:
PSR[31:24]為條件標志位域,用f表示,f為小寫。
PSR「23:16]為狀態(tài)位域,用s表示,s為小寫。
PSR[15:8]為擴展位域,用x表示,x為小寫。PSR[7:0]為控制位域,用c表示,c為小寫。該指令通常用于恢復或改變程序狀態(tài)寄存器的內(nèi)容,使用時一般要在 MSR 指令中指明將要操作的域。

(3)分支指令

①分支指令的作用
????????分支指令用于實現(xiàn)程序流程的跳轉(zhuǎn)。在ARM程序中有兩種方法可以實現(xiàn)程序流程的轉(zhuǎn)移:一是使用專門的跳轉(zhuǎn)指令,二是直接向程序計數(shù)器PC寫入跳轉(zhuǎn)地址值。
????????通過向程序計數(shù)器PC寫入跳轉(zhuǎn)地址值,可以實現(xiàn)在4GB的地址空間中的任意跳轉(zhuǎn)。在跳轉(zhuǎn)之前結(jié)合使用MOVLR,PC等類似指令,可以保存將來的返回地址值,從而實現(xiàn)在4GB連續(xù)的線性地址空間的子程序調(diào)用。

????????ARM 指令集中的分支指令可以完成從當前指令向前或向后的32MB的地址空間的跳轉(zhuǎn)。
②B--轉(zhuǎn)移指令
????????格式:B {cond}? ? ? ? ?Label:Label為目標地址格式

????????用途:B指令是最簡單的跳轉(zhuǎn)指令。一旦遇到一個B指令,ARM 處理器將立即跳轉(zhuǎn)到給定的目標地址,從那里繼續(xù)執(zhí)行。注意,存儲在跳轉(zhuǎn)指令中的實際值是相對當前 PC 值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(參考尋址方式中的相對尋址)。它是24位有符號數(shù),左移兩位后有效偏移為26位(前后32MB的地址空間,即+32MB)。
注意:如果使用指令:B.:這里的“。"表示當前地址,本條指令執(zhí)行的效果是自循環(huán),即進入死循環(huán)以等待系統(tǒng)復位,等于LabelBLabel.
③BX--帶狀態(tài)切換的轉(zhuǎn)移指令
????????格式:BX{cond}? ? ? ? ?<Rn>
????????用途:BX指令跳轉(zhuǎn)到指令中所指定的由寄存器Rn與OxFFFFFFFE 相與后的結(jié)果指示的目標地址(即Rn[0并不作為目標地址,而是作為狀態(tài)切換位),目標地址處的指令既可以是ARM指令,也可以是Thumb指令。如果 Rn中的最低位Rn「0]=1則指令將 CPSR 的T標志置1,且將目標地址的代碼解釋為Thumb(狀態(tài)切換到
Thumb 指令集)。
④BL--帶返回的轉(zhuǎn)移指令
????????格式:BL? ? {cond}? ? ? ?Label
????????用途:BL是帶返回的跳轉(zhuǎn)指令,在跳轉(zhuǎn)之前,會在寄存器R14中保存PC的當前值。因此,可以通過將 R14的內(nèi)容重新加載到PC中,以返回到跳轉(zhuǎn)指令之后的那個指令處執(zhí)行。該指令是實現(xiàn)子程序調(diào)用的一個基本且常用的手段。
⑤BLX--帶返回且?guī)顟B(tài)切換的轉(zhuǎn)移指令
????????格式:BLX? ? ?目標地址

????????用途:BLX指令從 ARM指令集跳轉(zhuǎn)到指令中所指定的目標地址,并將處理器的工作狀態(tài)由ARM 狀態(tài)切換到 Thumb 狀態(tài),該指令同時將 PC的當前內(nèi)容保存到寄存器 R14中。因此,當子程序使用Thumb 指令集,而調(diào)用者使用 ARM 指令集時,可以通過 BLX 指令實現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時,子程序的返回可以通過將寄存器 R14 值復制到 PC 中來完成。
(4)加載/存儲指令
①加載/存儲指令的作用和分類
????????用于在寄存器和存儲器之間傳送數(shù)據(jù)。加載指令用于將存儲器中的數(shù)據(jù)傳送到寄存器,存儲指令用于將寄存器中的數(shù)據(jù)傳送到存儲器。
????????加載/存儲指令有三類:單一數(shù)據(jù)加載/存儲、批量數(shù)據(jù)加載/存儲以及數(shù)據(jù)交換指令。

②單一數(shù)據(jù)加載/存儲指令
a.LDR--字數(shù)據(jù)加載指令

????????用途:LDR指令用于從存儲器中將一個32位的字數(shù)據(jù)傳送到目的寄存器中。當程序計數(shù)器 PC作為目的寄存器時,指令從存儲器中讀取的字數(shù)據(jù)被當作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。

b.LDRB-字節(jié)數(shù)據(jù)加載指令

????????用途:LDRB指令用于從存儲器中將一個8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時將寄存器的高 24位清零。當程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字數(shù)據(jù)被當作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。

c.LDRH--半字數(shù)據(jù)加載指令
????????用途:LDRH指令用于從存儲器中將一個16位的半字數(shù)據(jù)傳送到目的寄存器中,同時將寄存器的高16位潔零。當程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字數(shù)據(jù)被當作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。

d.STR--字數(shù)據(jù)存儲指令
????????用途:STR指令用于從源寄存器中將一個32位的字數(shù)據(jù)傳送到存儲器中。該指令在程序設計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。

e.STRB--字節(jié)數(shù)據(jù)存儲指令
????????用途:STRB指令用于從源寄存器中將一個8位的字節(jié)數(shù)據(jù)傳送到存儲器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。

f.STRH-半字數(shù)據(jù)存儲指令
????????用途:STRH指令用于從源寄存器中將一個16位的半字數(shù)據(jù)傳送到存儲器中。該半字數(shù)據(jù)為源寄存器中的低 16 位。

③批量數(shù)據(jù)加載/存儲指令ARM 微處理器所支持的批量數(shù)據(jù)加載/存儲指令可以一次在一片連續(xù)的存儲器單元和多個寄存器之間傳送數(shù)據(jù)。
a.LDM--批量數(shù)據(jù)加載指令
????????格式:LDM { 條件} {類型} 基址寄存器{ ! },寄存器列表{ ^ }
????????用途:LDM 指令用于將由基址寄存器所指示的一片連續(xù)存儲器讀到寄存器列表所指示的多個寄存器中,該指令的常見用途是將多個寄存器的內(nèi)容出棧。

b.STM--批量數(shù)據(jù)存儲指令

????????用途:STM 指令用于將寄存器列表所指示的多個寄存器的數(shù)據(jù)存儲到基址寄存器所指示的一片連續(xù)存儲器中,該指令的常見用途是將多個寄存器的內(nèi)容入棧

(5)協(xié)處理器指令
①協(xié)處理器指令的特點
????????ARM 微處理器可支持多達16個處理器,用于各種協(xié)處理操作在程序執(zhí)行的過程中,每個協(xié)處理器只執(zhí)行針對自身的協(xié)處理器指令,忽略 ARM 處理器和其他協(xié)處理器的指令。

②協(xié)處理器指令的作用
????????ARM 的協(xié)處理器指令主要用于 ARM 處理器初始化 ARM 協(xié)處理器的數(shù)據(jù)處理操作,在 ARM 處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),以及在ARM 協(xié)處理器的寄存器和存儲器之間傳送數(shù)據(jù)。
③協(xié)處理器指令

????????ARM 協(xié)處理器指令包括5條:CDP(協(xié)處理器數(shù)據(jù)操作指令)、LDC(協(xié)處理器數(shù)據(jù)加載指令)、STC(協(xié)處理器數(shù)據(jù)存儲指令)、MCR(ARM處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令)以及MRC(協(xié)處理器寄存器到 ARM 處理器寄存器的數(shù)據(jù)傳送指令)。
(6)異常中斷指令
①SWI--軟件中斷指令
????????格式:SWI? ?{cond}? imm24;? imm24為24位立即數(shù)

????????用途:SWI指令用于產(chǎn)生軟件中斷,以便用戶程序能調(diào)用操作系統(tǒng)的系統(tǒng)例程。操作系統(tǒng)在SWI的異常處理程序中提供相應的系統(tǒng)服務,指令中24位的立即數(shù)指定用戶程序調(diào)用系統(tǒng)例程的類型,相關(guān)參數(shù)通過通用寄存器傳遞,當指令中 24位的立即數(shù)被忽略時,用戶程序調(diào)用系統(tǒng)例程的類型由通用寄存器RO的內(nèi)容決定,同時,參數(shù)通過其他通用寄存器傳遞。

②BKPT--斷點中斷指令
????????格式:BKPT imm16; imm16為16位立即數(shù)
????????用途:BKPT指令產(chǎn)生軟件斷點中斷,可用于程序的調(diào)試。16 位立即數(shù)用于保存軟件調(diào)用中額外的斷點信息。

考點18 Thumb 指令集


(1)Thumb指令集和 ARM 指令的關(guān)系

①Thumb 指令集是 ARM 指令系統(tǒng)的一個子集,允許指令編碼為 16 位的長度。與等價的 32 位代碼相比較,Thumb指令集在保留32位代碼優(yōu)勢的同時,大大節(jié)省了系統(tǒng)的存儲空間。
②所有的 Thumb 指令都有對應的 ARM 指令,而且 Thumb 的編程模型也對應于 ARM 的編程模型,在應用程序的編寫過程中只要遵循一定的調(diào)用規(guī)則,Thumb 子程序和 ARM 子程序就可以互相調(diào)用。

a.當處理器在執(zhí)行 ARM 程序段時,稱ARM 處理器處于ARM 工作狀態(tài):
b.當處理器在執(zhí)行 Thumb 程序段時,稱 ARM 處理器處于 Thumb 工作狀態(tài)。
③大多數(shù) Thumb 指令是無條件執(zhí)行的,而幾乎所有的 ARM 指令都是有條件執(zhí)行的;大多數(shù)的 Thumb 數(shù)據(jù)處理指令的目的寄存器與其中一個源寄存器相同。
(2)Thumb中的單一寄存器加載/存儲指令
????????單一寄存器加載/存儲指令,Thumb只能訪問內(nèi)部通用寄存器R0~R7。多寄存器加載/存儲指令,Thumb 指令集是采用PUSHIPOP來實現(xiàn)的,指令執(zhí)行時以 R13 為堆棧指針,其內(nèi)容為基地址,實現(xiàn)滿遞增遞減堆棧。除可加載/存儲 RO~R7外,PSUH指令還可以存儲鏈接寄存器LR(R14),POP指令可以加載程序計數(shù)器 PC(R15)。

考點19 ARM 處理器支持的偽指令


(1)ADR 偽指令

????????格式:ADR? ?{cond}? Rd,expr
????????用途:ADR指令用于相對偏移地址加載到通用寄存器中。
(2)LDR 偽指令

????????格式:LDR? {cond}? Rd,=[expr |?label-expr]

????????用途:LDR 指令用于一個32位常數(shù)的加載或地址的加載。
????????使用 LDR 偽指令有兩個目的:

????????①當用 MOV或 MNV 指令無法加載符合要求的 32 位立即數(shù)時,可用 LDR 偽指令加載任意 32 位操作數(shù)到寄存器。因為MOV或MNV指令加載的32位數(shù)據(jù)只能是8位立即數(shù)通過移位的方式得到的,所以不能加載任意 32 位常數(shù),如0x12345678這樣的操作數(shù)不能用MOV指令完成。
????????②當需要程序的相對偏移地址或外部地址加載到寄存器時可使用LDR 偽指令。

(3)NOP空操作
????????格式:NOP
????????用途:產(chǎn)生所需的 ARM 無操作代碼,用于簡單延時,與MOVRd,Rd等效:

考點20? ARM 匯編器所支持的偽指令


(1)偽指令和偽操作的概念和作用
①概念
????????在 ARM 匯編語言程序中,有一些特殊指令助記符。這些助記符與指令系統(tǒng)的助記符不同,沒有相對應的操作碼,稱這些特殊指令助記符為偽指令,它們所完成的操作稱為偽操作。
②作用
????????偽指令在源程序中的作用是為完成匯編程序作各種準備工作,這些偽指令僅在匯編過程中起作用,一旦匯編結(jié)束,偽指令的使命就完成。偽指令一般與編譯程序有關(guān)在不同的編譯環(huán)境下有不同的編寫形式和規(guī)則。RealView MDK使用很廣,支持所有 ARM 處理器。而 ADS 和 MDK 使用同樣的匯編工具armasm、鏈接工具 armlink,因此這部分主要介紹基于ammasm 匯編器的偽指令及程序設計。
(2)常用偽指令

考點21 ARM匯編語言的語句格式

(1)ARM 匯編語言的語句格式及說明
????????ARM(Thumb)匯編語言的語句格式為:{標號 }?{指令或偽指令}?;{注釋}

????????在匯編語言程序設計中,每一條指令的助記符可以全部用大寫或全部用小寫,但不允許在一條指令中大小寫混用。在行的末尾用“\”表示下一行與本行為同一條語句。此外標號必須頂格寫,不允許前面有空格。

????????ARM 匯編語言的標號后面是沒有“:”的。
(2)在匯編語言程序中常用的符號
①符號的命名的規(guī)則
a.符號區(qū)分大小寫,同名的大小寫符號會被編譯器認為是兩個不同的符號。
b.符號在其作用范圍內(nèi)必須唯一。
c.自定義的符號名不能與系統(tǒng)的保留字相同。
d.符號名不應與指令或偽指令同名。
②)變量
????????程序中的變量是指其值在程序的運行過程中可以改變的量。
a.數(shù)字變量用于在程序的運行中保存數(shù)字值,但需注意數(shù)字值的大小不應超出數(shù)值變量所能表示的范圍。
b.邏輯變量用于在程序的運行中保存邏輯值,邏輯值只有兩種取值情況:真或假。
c.字符串變量用于在程序的運行中保存一個字符串,但注意字符串的長度不應超出字符串變量所能所能表示的范圍。
③常量程序中的常量是指其值在程序的運行過程中不能被改變的量。

a.數(shù)字常量一般為32位的整數(shù),當作為無符號數(shù)時其取值范圍為0~2^{32}-1;當作為有符號數(shù)時其取值范圍為-2^{31}~2^{31}-1
b.邏輯常量只有兩種取值情況:真或假。
c.字符串常量為一個固定的字符串,一般用于程序運行時的信息提示。
④變量代換
????????程序中的變量可通過代換操作取得一個常量。代換操作符為“S”。
a.如果在數(shù)值變量前面有一個代換操作符“S”,編譯器會將該數(shù)字變量的值轉(zhuǎn)換為十六進制的字符串,并將該十六進制的字符串代換“$”后的數(shù)字變量。
b.如果在邏輯變量前面有一個代換操作符“S”,編譯器會將該邏輯變量代換為它的取值(真或假)
c.如果在字符串變量前面有一個代換操作符“S”,編譯器會將該字符串變量的值代換“$”后的字符串變量。
(2)匯編語言程序中的表達式和運算符
在匯編語言程序設計中,也經(jīng)常使用各種表達式。表達式一般由變量、常量、運算符和括號構(gòu)成。
①表達式運算優(yōu)先級

a.優(yōu)先級相同的雙目運算符的運算順序為從左到右。
b.相鄰的單目運算符的運算順序為從右到左,且單目運算符的優(yōu)先級高于其他運算符
c.括號運算符的優(yōu)先級最高。
②數(shù)值表達式及運算符
·數(shù)字表達式一般由數(shù)值常量、數(shù)值變量、數(shù)值運算符和括號構(gòu)成。

a.算術(shù)運算符:+、-、*、/及 MOD
b.移位運算符:ROL、ROR、SHL及SHRb.
c.數(shù)值邏輯運算符:AND、OR、NOT及EOR

③邏輯表達式及運算符
·邏輯表達式一般由邏輯量、邏輯運算符和括號構(gòu)成,其表達式的運算結(jié)果為真或假。

a.關(guān)系操作符:=、>、<、>=、<=、/=、<>
b.邏輯運算符:LAND、LOR、LNOT及LEOR
④字符串表達式及運算符

????????字符串表達式一般由字符串常量、字符串變量、運算符和括號構(gòu)成。編譯器所支持的字符串最大長度為 512B

a.返回字符串長度運算符:LEN
b.字節(jié)整數(shù)轉(zhuǎn)換為字符運算符:CHR
c.字符串轉(zhuǎn)換運算符:STR
d.返回左端字符串運算符:LEFT
e.返回右端字符串運算符:RIGHT
f.合并字符串運算符:CC

考點22 匯編語言的程序設計舉例


(1)匯編程序的結(jié)構(gòu)
①匯編源程序的結(jié)構(gòu)
a.結(jié)構(gòu)單位
????????在 ARM(Thumb)匯編語言程序中,以程序段為單位組織代碼。段是相對獨立的指令或數(shù)據(jù)序列,具有特定的名稱。
b.段的分類
????????段可以分為代碼段和數(shù)據(jù)段,代碼段的內(nèi)容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運行時需要用到的數(shù)據(jù)。一個匯編程序至少應該有一個代碼段,當程序較長時,可以分割為多個代碼段和數(shù)據(jù)段,多個段在程序編譯鏈接時最終形成一個可執(zhí)行的映像文件。
②)匯編可執(zhí)行映像文件的結(jié)構(gòu)
a.一個或多個代碼段,代碼段的屬性為只讀。
b.零個或多個包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀/寫。
c.零個或多個不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀/寫。鏈接器根據(jù)系統(tǒng)默認或用戶設定的規(guī)則,將各個段安排在存儲器中的相應位置,因此源程序中段之間的相對位置與可執(zhí)行的映像文件中段的相對位置一般不會相同。
③匯編源程序的示例

AREA Init,CODE,READONLY
ENTRY
Start
LDR RO,=0x3FF5000
MOVRI,#0xFF                ;或LDR RI,=0xFF
STR RI,[RO]
LDR RO,=0x3FF5008
MOVR1,#0x01                ;或LDR R1,=0x01
STR RI,[RO]
...
END

(2)S3C2410系統(tǒng)引導程序代碼
①系統(tǒng)引導程序的功能
a.關(guān)看門狗定時器,關(guān)中斷
b.設置CPU速率及時鐘頻率
c.設置堆棧
d.切換用戶模式并初始化用戶堆棧
e.如果使用 DRAM 或其他設備,還要設置相關(guān)寄存器,初始化這些設備e.
f.初始化存儲空間
g.跳轉(zhuǎn)到C程序入口
②啟動文件 Startup.S 及其代碼分析
引導程序主要是一個啟動代碼文件Startup.S.
(3)順序程序設計
①順序程序設計的特點
順序程序設計也稱簡單程序設計或直接程序設計,沒有分支,也沒有循環(huán),是一條指令一條指令接下去執(zhí)行程序結(jié)構(gòu)。

(4)分支程序設計
①分支程序結(jié)構(gòu)的實現(xiàn)方法
ARM 分支程序結(jié)構(gòu)通常用分支指令B加上條件執(zhí)行來實現(xiàn)。

②分支程序結(jié)構(gòu)的實例
假如要把連續(xù)存放在內(nèi)存區(qū)域0x30007000~0x30007008中的3個32位無符號數(shù)按遞減次序排列,并在其后寫入一個字節(jié)的標志 0xOD。為了實現(xiàn)排序操作,可以對3個數(shù)兩兩進行比較,比較后的大數(shù)放在前面,從而達到3個數(shù)按遞減次序排列之目的。實現(xiàn)該算法的流程圖如圖所示。

(5)循環(huán)程序設計
①循環(huán)程序的作用
????????當需要重復執(zhí)行某段程序時,可以利用循環(huán)程序結(jié)構(gòu)。循環(huán)結(jié)構(gòu)一般是根據(jù)某一條件判斷為真或假來確定是否重復執(zhí)行循環(huán)體。
②循環(huán)結(jié)構(gòu)的程序的結(jié)構(gòu)
a.循環(huán)初始部分--為開始循環(huán)準備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的初始值等。
b.循環(huán)體部分--重復執(zhí)行的程序代碼,其中包括對循環(huán)條件修改的程序段。
c.循環(huán)控制部分--判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)。其中,循環(huán)控制部分是編程的關(guān)鍵和難點。循環(huán)條件判斷的循環(huán)控制可以在進入循環(huán)之前進行,即形成“先判斷、后循環(huán)”的循環(huán)程序結(jié)構(gòu)。如果循環(huán)條件判斷的循環(huán)控制在循環(huán)之后進行,即形成“先循環(huán)、后判斷”的循環(huán)程序結(jié)構(gòu)。

③循環(huán)程序的實現(xiàn)原理
????????ARM 的循環(huán)程序控制通常用比較指令CMP、ADD或SUB等能產(chǎn)生條件的指令,然后用B加上條件分支來達到目的。對于先循環(huán)后判斷的結(jié)構(gòu),首先用一個通用寄存器,如RO0作為循環(huán)次數(shù)計數(shù)器,在主循環(huán)體內(nèi)對 R0減1操作,并判斷R0是否為0,不為0則繼續(xù),為0則結(jié)束循環(huán)。

④由計數(shù)控制循環(huán)

????????用一個通用寄存器 Rn(n=0,1,2,3,4,5,6,7)作為計數(shù)器,先給初始值,然后每循環(huán)一次減 1,直到循環(huán)次數(shù)為0結(jié)束循環(huán),程序結(jié)構(gòu)如下:

MOV Rn ,#Counter        ;循環(huán)體初始化部分... LPM        ...                     ;循環(huán)體SUBS Rn,Rn,#1           ;修改計數(shù)值BCC LPM                 ;控制循環(huán)部分或:MOV Rn ,#Counter         ;循環(huán)體初始化部分...LPM        ...                      ;循環(huán)體SUBRn,Rn,#1              ;修改計數(shù)值CMPRn,#0                 ;與0比較BNE LPM                  ;控制循環(huán)部分

⑤由條件控制循環(huán)

????????有些情況是不能預先知道計數(shù)次數(shù)的,要通過一定的條件控制循環(huán),這種情況的循環(huán)控制就要用到相關(guān)條件,通過相關(guān)條件控制循環(huán)是否結(jié)束。

????????例題:從Ox30500000開始的內(nèi)存區(qū)域存放看若十字節(jié)的BCD碼數(shù)據(jù),開以0xOD 結(jié)束。編程對這些數(shù)據(jù)進行累加和計算,取累加和的前兩個字節(jié)放到這個數(shù)據(jù)結(jié)束字符之后的兩字節(jié)中,并把數(shù)據(jù)個數(shù)寫入后一個單元中。

	AREA EXAMPLE4,CODE,READONLYENTRYCODE32
MYADD	 MOV R0,#0MOV R1,#0LDR R2, =0x30500000
LOPPA	LDRB R3,[R2]CMP R3,#0x0DBNE LOPPOUTADD R1,R1,R3ADD R2,R2,#1ADD R0,R0,#1B LOPPA
LOPPOUT	STRH R1,[R2]STR R0,[R2+2]END

(6)子程序設計
?①ARM 匯編語言子程序設計與x86的子程序設計的比較

????????相同點是都有一個子程序的名稱,也有子程序的返回指令;不同點是ARM 匯編的返回不是RET等,采用MOVPC,LR返回。如果一個子程序不在調(diào)用的同一個文件中,則需要先用IMPORT 聲明是外部的,否則無法正常調(diào)用該子程序。子程序在同一文件中無需聲明。IMPORT聲明可以放在AREA語句之前。

②ARM 匯編語言程序中子程序的調(diào)用
????????子程序的調(diào)用一般是通過 BL指令來實現(xiàn)的。在程序中,使用指令:BL 子程序名即可完成子程序的調(diào)用。該指令在執(zhí)行時完成如下操作:將子程序的返回地址存放在鏈接寄存器LR中,同時將程序計數(shù)器PC指向子程序的入口點。當子程序執(zhí)行完畢需要返回調(diào)用處時,只需將存放在LR中的返回地址重新拷貝給程序計數(shù)器PC。在調(diào)用子程序的同時,也可以完成參數(shù)的傳遞和從子程序返回運算結(jié)果,通??梢允褂眉拇嫫?RO~R3 完成。

考點23?嵌入式C語言與匯編語言混合程序設計


(1)匯編語言與C語言的混合編程的方式
????????①在匯編程序和C語言程序之間進行變量的互訪。
????????②匯編程序、C 語言程序間的相互調(diào)用。
????????③在C語言代碼中嵌入?yún)R編指令。
(2)混合編程中各自的作用
????????在這3種混合編程技術(shù)中,必須遵守一定的調(diào)用規(guī)則,如物理寄存器的使用、參數(shù)的傳遞等。在實際的編程應用中使用較多的方式是程序的初始化部分用匯編語言完成,而主要的編程任務用C語言完成。程序在執(zhí)行時首先完成初始化過程,然后跳轉(zhuǎn)到C語言程序中。匯編程序和C語言程序之間一般沒有參數(shù)的傳遞,也沒有頻繁的相互調(diào)用。
(3)混合調(diào)用的規(guī)則

????????ARM-Thumb 過程調(diào)用規(guī)范(ARM-Thumb Produce Call Standard,ATPCS)規(guī)定了一些子程序之間調(diào)用的基本規(guī)則,這些基本規(guī)則包括子程序調(diào)用過程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則、參數(shù)的傳遞規(guī)則。這也使得單獨編譯的C語言程序和匯編語言程序之間能夠相互調(diào)用。
(4)C語言調(diào)用匯編語言? ?
????????在匯編程序中使用 EXPORT偽指令作聲明,使得程序可以被別的程序調(diào)用。在C語言程序中使用EXTERN關(guān)鍵詞聲明該匯編程序。

(5)匯編語言程序調(diào)用C語言程序
????????在C語言程序中,不需要使用任何關(guān)鍵字來聲明將被匯編語言調(diào)用的C語言程序,但是在匯編語言程序調(diào)用C語言程序之前,需要在匯編語言程序中使用IMPORT偽操作來聲明該C語言程序。在匯編語言程序中通過BL指令來調(diào)用子程序。

(6)C語言程序嵌入?yún)R編語言程序的方法

????????armcc和armcpp支持完整的ARM指令集,tcc和tcpp支持Thumb指令集。

①內(nèi)嵌匯編的語法格式? ?
ASM
匯編指令序列;
其中 ASM 可大寫也可小寫,前面的“_ _”為兩個下畫線“_”

②內(nèi)嵌匯編的主要特點
a.內(nèi)嵌的操作數(shù)只能是無符號數(shù),但可以是寄存器、常量或C語言表達式。

b.內(nèi)嵌匯編使用物理寄存器有以下限制:
第一,不能直接向PC寄存器賦值,程序的跳轉(zhuǎn)只能用B指令和BL指令實現(xiàn)。

第二,C語言編譯時會用到寄存器 RO~R3、R12、RI3、R14,編程時盡量不要用這些物理寄存器,可使用R4~R7。編程時最好使用C語言的變量。如果編程時使用通用寄存器,則容易沖突。
c.嵌入?yún)R編可以使用C語言的標號,但只能用B指令使用C語言中的標號,BL不能使用C語言中的標號

d.內(nèi)嵌匯編不支持用于內(nèi)存分配的偽指令,所有內(nèi)存分配均由C語言完成。
e.內(nèi)嵌匯編器與 armasm 匯編的區(qū)別:
第一,內(nèi)嵌匯編不能通過寄存器PC返回當前指令的地址。
第二,內(nèi)嵌匯編不支持ADR、ADRL以及LDR偽指令,而使用MOV Rn,expression 指令向寄存器賦值
第三,不支持標號表達式,不支持BX和BLX。

參考內(nèi)容

????????文中內(nèi)容均來自計算機等級考試《三級嵌入式系統(tǒng)開發(fā)》

http://m.risenshineclean.com/news/60744.html

相關(guān)文章:

  • 1核2g 做網(wǎng)站百度手機應用商店
  • 做網(wǎng)站的小圖標360網(wǎng)站排名優(yōu)化
  • 昆明哪些做網(wǎng)站建設的公司網(wǎng)站惡意點擊軟件
  • 做水果網(wǎng)站行營銷推廣的形式包括
  • 亞馬遜網(wǎng)站推廣怎么做學網(wǎng)絡營銷有用嗎
  • 浙江做網(wǎng)站的公司百度公司招聘信息
  • 哪個網(wǎng)站做調(diào)查問卷賺錢長春seo招聘
  • 騰訊云注冊域名后怎么做網(wǎng)站剛剛突發(fā)1驚天大事
  • wex5網(wǎng)站開發(fā)北京seo助理
  • 南京電商網(wǎng)站建設公司百度搜索引擎的原理
  • 免費茶葉網(wǎng)站建設點擊器
  • 360免費做網(wǎng)站電腦零基礎(chǔ)培訓班
  • icp備案 網(wǎng)站服務內(nèi)容蘇州網(wǎng)站制作開發(fā)公司
  • 上海網(wǎng)站建設方案托管銀川seo
  • 太原網(wǎng)站設計公司軟件開發(fā)定制
  • 鄭州網(wǎng)站建設國奧大廈網(wǎng)站seo資訊
  • 時時彩網(wǎng)站開發(fā)違法嗎升華網(wǎng)絡推廣軟件
  • 濮陽市建設分局網(wǎng)站百度賬號中心
  • qq郵箱登錄入口網(wǎng)頁版廣州seo網(wǎng)站推廣公司
  • 搭建cms網(wǎng)站網(wǎng)絡互聯(lián)網(wǎng)推廣
  • 廣東兩學一做網(wǎng)站西安網(wǎng)是科技發(fā)展有限公司
  • 江門模板建站哪家好網(wǎng)站推廣網(wǎng)絡營銷方案
  • 網(wǎng)站里的橫幅怎么做項目網(wǎng)站
  • 鄭州網(wǎng)站建設哪家好打開百度一下網(wǎng)頁版
  • 青之峰做網(wǎng)站廈門seo新站策劃
  • 臨清網(wǎng)站制作公司plc培訓機構(gòu)哪家最好
  • 創(chuàng)建公司策劃書寧波優(yōu)化推廣選哪家
  • 網(wǎng)站建站方案說明書網(wǎng)站制作的費用
  • 哪家上市公司做視頻網(wǎng)站培訓機構(gòu)專業(yè)
  • wordpress導航目錄手機優(yōu)化大師為什么扣錢