娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

一、跳轉指令

跳轉指令用于實現程序流程的跳轉,在ARM 程序中有兩種方法可以實現程序流程的跳轉:


Ⅰ.使用專門的跳轉指令。

Ⅱ.直接向程序計數器PC 寫入跳轉地址值。

通過向程序計數器PC 寫入跳轉地址值,可以實現在4GB 的地址空間中的任意跳轉,在跳轉之前結合使用 MOV LR,PC 等類似指令,可以保存將來的返回地址值,從而實現在4GB 連續的線性地址空間的子程序調用。


ARM指令集中的跳轉指令可以完成從當前指令向前或向后的32MB的地址空間的跳轉,包括以下4 條指令:

 

1、 B 指令

B 指令的格式為:

B{條件} 目標地址

B 指令是最簡單的跳轉指令。一旦遇到一個 B 指令,ARM 處理器將立即跳轉到給定的目標地址,從那里繼續執行。注意存儲在跳轉指令中的實際值是相對當前PC 值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(參考尋址方式中的相對尋址)。它是 24 位有符號數,左移兩位后有符號擴展為 32 位,表示的有效偏移為 26 位(前后32MB 的地址空間)。以下指令:


B Label ;程序無條件跳轉到標號Label 處執行

CMP R1,#0 ;當CPSR 寄存器中的Z 條件碼置位時,程序跳轉到標號Label 處執行

BEQ Label

 

2、 BL 指令

BL 指令的格式為:

BL{條件} 目標地址

BL 是另一個跳轉指令,但跳轉之前,會在寄存器R14 中保存PC 的當前內容,因此,可以通過將R14 的內容重新加載到PC 中,來返回到跳轉指令之后的那個指令處執行。該指令是實現子程序調用的一個基本但常用的手段。以下指令:


BL Label ;當程序無條件跳轉到標號Label 處執行時,同時將當前的PC 值保存到R14 中

 

3、 BLX 指令

BLX 指令的格式為:

BLX 目標地址

BLX 指令從ARM 指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態有ARM 狀態切換到Thumb 狀態,該指令同時將PC 的當前內容保存到寄存器R14 中。因此,當子程序使用Thumb 指令集,而調用者使用ARM 指令集時,可以通過BLX 指令實現子程序的調用和處理器工作狀態的切換。同時,子程序的返回可以通過將寄存器R14 值復制到PC 中來完成。

 

4、 BX 指令

BX 指令的格式為:

BX{條件} 目標地址

BX 指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM 指令,也可以是Thumb 指令。

 

ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集。

 ARM指令集效率高,但是代碼密度高

 Thumb指令集具有較高的代碼密度,卻仍然保持著ARM的大多數性能上的優勢,它是ARM的子集。

 所有的ARM置零都是可以條件執行的,而Thumb置零僅有一條指令具備條件執行的功能。

 ARM和Thumb程序可以相互調用,相互之間狀態切換開銷幾乎為零。

 

首先我們來看一下分類:

一、數據處理指令操作數尋址方式

               1、立即數尋址方式

               2、寄存器尋址方式

               3、寄存器移位尋址方式

二、存儲器訪問指令操作數尋址方式

               1、寄存器間接尋址

               2、基址變址尋址

               3、相對尋址

               4、多寄存器尋址(塊拷貝尋址)

               5、堆棧尋址


下面來一一介紹:

ARM有9種尋址方式

尋址方式:

1、立即尋址:

立即尋址指令中的操作碼字段后面的部分就是操作數本省,也就是說,數據就包含再指令,取指令也就取出了可以立即使用的操作數。舉例:

        SUBS   R0,R0,#1              ;R0減1,結果放入R0中,并且影響標志位

        MOV    R0,#0xFF000          ;將立即數0xFF000裝入R0寄存器

ARM規定:這個立即數必須符合8位圖格式,負責必須使用“文字池”方式,通過存儲器訪問指令加載,所謂的8位圖格式就是指,這個數據能通過一個8bit的數循環右移偶數位得到。


2、寄存器尋址:        

操作數的值在寄存器中,指令中的地址字段指出的是寄存器的編號,指令執行的時候直出寄存器值來操作。舉例:

         MOV   R1,R2                ;將R2的值存入R1

         MOV   R0,R1,R2              ;將R1的值減去R2的值,結構存到R0


3、寄存器移位尋址

寄存器移位尋址是ARM處理器特有的尋址方式。當第二個操作數是寄存器移位方式時,第二個操作數在與第一個操作數結合之前,選擇進行移位操作。舉例:

        MOV    R0,R2,LSL #3      ;R2的值左移3位,結果放入R0,即R0=R2*8

        ANDS  R1,R1,R2,LSL R3    ;R2的值左移R3位,然后和R1相"與"操作,結構放入R1

    可采用移位操作的指令如下:

     LSL左移、LSR右移、ASR算術右移、ROR循環右移、RRX帶擴展的循環右移

4、寄存器間接尋址:

寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存再寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針,舉例:

         LDR   R1,[R2]          ;將R2指向的單元中的數據保存再R1中

         SWP   R1,R1,[R2]       ;將寄存器R1的值和R2指向的單元中進行內容交換

5、基址變址尋址:

基址尋址就是將基址寄存器的內容與指令中給出的偏移量進行相加,形成操作數的有效地址。

基址尋址用于訪問基址附近的存儲單元,常用于查表、數組操作以及功能不見寄存器訪問等


舉例:

        LDR   R2,[R3,#0x0c]     ; 讀取R3 0x0c地址指向的存儲單元的內容,放入R2

        STR   R1,[R0,#-4]!       ;先R0=R0-4,然后把R1的值寄存到R0所指向的單元中

        LDR   R1,[R0,R3,LSL #1]  ;將R0 R3*2地址上的單元的內容讀出,并存入R1中

6、相對尋址:

    相對尋址是基址尋址的一種變通。由程序計數器PC提供基址地址,指令中的地址碼字段為偏移量。兩者相加后得到的地址即為操作數的有效地址。


7、多寄存器尋址:

多寄存器尋址即一次可傳送幾個寄存器的值,允許一條指令傳送16個寄存器的任何子集或

所有的存儲器,舉例:

 LDMIA   R1!,{R2-R7,R12};將R1指向的單元中的數據讀出到R2---R7、R12中(R1自自動 )

 STMIA   R0!,{R2-R7,R12};將R2---R7、R12中的數據一次讀入到R0指向的單元中(R0自動 )


8、堆棧尋址(塊拷貝尋址):

        堆棧是一種按特定順序進行存取的存儲區,操作順序分為“先進后出”和“后進先出”,堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向的存儲區域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。

        存儲器堆棧可以分為兩種:

          向上生長:遞增堆棧

          向下生長:遞減堆棧

     還有從當前堆棧指針指向的內容是否有效可以分為:滿遞增、空遞增、滿遞減、空遞減

     舉例:

        STMFD    SP!,{R1-R7,LR}    ;將R1---R7、LR入棧。滿遞減堆棧

        LDMFD    SP!,{R1-R7,LR}    ;數據出棧,放入R1---R7、LR寄存器,滿遞減堆棧

 

ARM指令的基本格式

ARM指令的基本格式為:

   {}  {S}    { , }

其中,<  >內的項是必需的,{  }內的項是可選的。

(1)Opcode項

Opcode是指令助記符,即操作碼,說明指令需要執行的操作,在指令中是必需的。


(2)Cond項(command)

Cond項表明了指令的執行的條件,每一條ARM指令都可以在規定的條件下執行,每條ARM指令包含4位的條件碼,位于指令的最高4位[31:28]。條件碼共有16種,每種條件碼用2個字符表示,這兩個字符可以添加至指令助記符的后面,與指令同時使用。當指令的執行條件滿足時,指令才被執行,否則指令被忽略。如果在指令后不寫條件碼,則使用默認條件AL(無條件執行)。

指令的條件碼

條 件 碼

助記符后綴

標    志

含    義

0000

EQ

Z置位

相等equal

0001

NE

Z清零

不相等not equal

0010

CS

C置位

無符號數大于或等于Carry Set

0011

CC

C清零

無符號數小于

0100

MI

N置位

負數minus

0101

PL

N清零

正數或零plus

0110

VS

V置位

溢出

0111

VC

V清零

沒有溢出

1000

HI

C置位Z清零

無符號數大于high

1001

LS

Z置位C清零

無符號數小于或等于less

1010

GE

N等于V

帶符號數大于或等于

1011

LT

N不等于V

帶符號數小于least

1100

GT

Z清零且(N等于V)

帶符號數大于great

1101

LE

Z清零或(N不等于V)

帶符號數小于或等于

1110

AL

忽略

無條件執行all

1111




條件碼應用舉例:

例:比較兩個值大小,并進行相應加1處理,C語言代碼為:

if  ( a > b )  a++;

else  b++;

對應的ARM指令如下(其中R0中保存a 的值,R1中保存b的值):

CMP  R0, R1  ; R0與R1比較,做R0-R1的操作

ADDHI  R0, R0, #1  ;若R0 > R1, 則R0 = R0 + 1

ADDLS  R1, R1, #1  ; 若R0 <= R1, 則R1 = R1 + 1

 

CMP比較指令,用于把一個寄存器的內容和另一個寄存器的內容或一個立即數進行比較,同時更新CPSR中條件標志位的值。指令將第一操作數減去第二操作數,但不存儲結果,只更改條件標志位。

CMP  R1, R0  ;做R1-R0的操作。

CMP  R1,#10  ;做R1-10的操作。

(3) S項(sign)

S項是條件碼設置項,它決定本次指令執行的結果是否影響至CPSR寄存器的相應狀態位的值。該項是可選的,使用時影響CPSR,否則不影響CPSR。

(4)Rd項(destination)

Rd是指令中的目標寄存器,它是必需的。根據指令的不同,有些指令中要求Rd必須有R0~R7之間,有些要求Rd必須在R0~R14之間,有些則沒有特殊要求。

(5)Rn項

Rn是第一個操作數的寄存器,和Rd一樣,不同的指令對其的使用有不同的要求。

(6)Opcode2項

Opcode2項是第二個操作數,在ARM指令中,該操作數有三種形式:立即數形式、寄存器Rm形式和寄存器加移位形式(Rm, shift)。

例如:

SUB  R3,  R1,  #10

SUB  R3,  R1,  R2

SUB  R3,  R1,  R2,  LSL  #2

SUB  R3,  R1,  R2,  LSL  R0

ARM指令詳解

ARM指令集可分為以下6類:

l  跳轉指令

l  數據處理指令

l  程序狀態寄存器(PSR)處理指令

l  加載/存儲指令

協處理器指令

l  異常產生指令

 

ARM指令及功能描述

助 記 符

指令功能描述

ADC

帶進位加法指令

ADD

加法指令

AND

邏輯與指令

B

跳轉指令

BIC

位清零指令

BKPT

軟件斷點

BL

帶返回的跳轉指令

BLX

帶返回和狀態切換的跳轉指令

BX

帶狀態切換的跳轉指令

CDP

協處理器數據操作指令

CMN

取反比較指令

CMP

比較指令

EOR

邏輯異或指令

LDC

存儲器到協處理器的數據傳輸指令

LDM

加載多個寄存器的指令

LDR

存儲器到寄存器的數據傳輸指令

MCR

從ARM寄存器到協處理器寄存器的數據傳輸指令

MLA

乘加運算指令

MOV

數據傳輸指令

MRC

從協處理器寄存器到ARM寄存器的數據傳輸指令

MRS

傳送CPSR或SPSR的值到通用寄存器的指令

MSR

傳送通用寄存器的值到CPSR或SPSR的指令

MUL

32位乘法指令

MVN

數據取反傳送指令

ORR

邏輯或指令

RSB

反向減法指令

RSC

帶借位的反向減法指令

SBC

帶借位的減法指令

STC

協處理器寄存器寫入存儲器指令

STM

存儲多個寄存器的值到存儲器指令

STR

存儲寄存器的值到存儲器的指令

SUB

減法指令

SWI

軟件中斷指令

SWP

寄存器與存儲器 或 寄存器與寄存器之間的數據交換指令

TEQ

相等測試指令

TST

位測試指令

 

1. 跳轉指令

用于實現程序流程的跳轉,在ARM程序中有兩種方法可以實現程序流程的跳轉:一是使用專門的跳轉指令,二是直接向程序計數器PC寫入跳轉地址值。第二種方法可以實現在4GB的地址空間中的任意跳轉,在跳轉之前結合使用“MOV LR , PC”等類似指令,可以保存將來的返回地址值,從而實現在4GB連續的線性地址空間的子程序調用。

1)ARM指令集中的跳轉指令可以實現從當前指令向前或向后的32MB的地址空間的跳轉。

l  B指令

格式:

B{條件}  目標地址

注意,存儲在跳轉指令中的實際值是相對當前PC值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(相對尋址)。這個偏移量是一個24位的有符號數,左移兩位后表示的有效偏移為26位(前后32MB的地址空間)。{}表示可以省略。

如:B Label     程序無條件跳轉到標號Label處執行。

CMP R1,#0

BEQ Label

當CPSR寄存器中的Z條件碼置位時,程序跳轉到Label處執行。

當前PC:是指跳轉指令本身的起始地址。

l  BL指令

格式:

BL{條件}  目標地址

這條指令在跳轉之前,會在寄存器R14中保存當前的下一條指令的地址,因此,可以通過將R14重新加載到PC中,來返回到跳轉指令之后的那條指令處執行。該指令是實現子程序調用的一種常用手段。

l  BX 指令

格式:

BX {條件}  目標地址

BX指令中所指定的目標地址,只能使用寄存器的尋址方式,即跳轉的目標地址應先保存在一個寄存器中。指令在實現跳轉的同時,完成處理器的工作狀態的切換(ARM狀態與Thumb狀態間的切換)。

BX指令中,用寄存器的最低位來指示切換到哪一個工作狀態。如寄存器最低位為1,則把目標地址處的代碼解釋為Thumb代碼,進入Thumb工作狀態,并自動將CPSR中的控制位T置1。若寄存器最低位為0,則把目標地址處的代碼解釋為ARM代碼,進入ARM工作狀態,并自動將CPSR中的控制位T置0。

ADRL  R0,  ThumbFun + 1     ;生成分支地址并置最低位為 1

BX  R0    ;跳轉到R0所指定的地址,并切換處理器到Thumb工作狀態

ThumbFun  

…         ;Thumb匯編指令

| BLX指令

以上兩條指令的綜合。

2. 數據處理指令

數據處理指令可分數據傳送指令、算術邏輯運算指令和比較指令等。數據傳送指令用于在寄存器和存儲器之間進行數據的雙向的傳輸。所有ARM數據處理指令均可選擇使用S后綴,以影響狀態標志CPSR。比較指令(CMP、CMN、TST、TEQ)不保存運算結果,這些指令也不使用S后綴,但會直接影響CPSR中的相應的狀態標志位。

(1)數據傳送指令MOV 和MVN

格式:

MOV {條件} {S} 目的寄存器, 源操作數

MOV指令可以完成從另一個寄存器、被移位的寄存器、或將一個立即數加載到目的寄存器。與MVN指令不同的是在傳送之前,將被傳送的對象先按位取反,再傳送到目的寄存器。

例:MVN  R1 ,  #0XFF    ;R1 ← 0X FFFF FF00

  MVN  R1 ,  R2

  MOV PC,R14;將寄存器R14的值傳送給PC,用于子程序返回。

(2) 數據比較指令CMP , CMN , TST , TEQ

例:

CMP  R1,  R2  ; 做R1 – R2 的操作,結果不保存,但影響標志位。

CMP R1 , #10  ;做R1 - 10的操作,結果不保存,但影響標志位。

CMN 指令用于把一個寄存器的內容和另一個寄存器的內容或立即數取反后進行比較操作,根據運算結果影響CPSR中的標志位。該指令實際完成操作數1和操作數2相加,并根據結果更改條件標志位。

TST位測試指令,用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,并根據運算結果更新CPSR中條件標志位的值。操作數1是要測試的數,而操作數2 是一個位掩碼,該指令一般用來檢測是否設置了特定的位。

TST {條件} 操作數1, 操作數2

[1] [2] [3]
關鍵字:ARM  Cortex  指令集 引用地址:ARM Cortex M3指令集

上一篇:iOS程序破解——ARM匯編基礎
下一篇:淺析ARM公司在物聯網領域的戰略布局

推薦閱讀

2018 年,整個汽車行業所有人都在談論智能化、網聯化......卻沒有多少人談論汽車變得智能后會衍生出的一個大問題:信息安全問題。今天的兩位主角,是全球知名的白帽黑客、頂級安全專家 Charlie Miller 和 Chris Valasek,兩人如今的 Title 都是通用 Cruise 自動駕駛汽車首席安全架構師。 這兩位的履歷有多強悍呢?2012 年,Miller 和 Chris...
本教程是NI測量基礎系列教程的一部分。 該系列教程將通過理論和實踐兩個方面介紹一些常見測量應用。 本教程主要介紹了數字I/O和邏輯分析儀的常用術語和定義。 1. 抖動抖動是指與事件理想時序的偏差,并通常基于參考信號的過零點進行測量。 抖動通常來自于串擾、同步開關輸出和其它定期發生的干擾信號。 由于抖動會隨時間變化,抖動的測量和量化既可以...
引 言隨著社會的迅速發展,智能小區逐漸進人人們的生活,而自動抄表系統是智能小區的重要功能之一。在水、電、氣管理方面,采用自動抄表技術,不僅能節約人力資源,更重要的是可提高抄表的準確性,減少因估計或謄寫而造成帳單出錯的現象,使水、電、氣管理部門能及時準確獲得數據信息。另外用戶不再需要與抄表者預約上門抄表時間,還能迅速查詢帳單,所以...
前11月廣東機器人產量增長迅猛,工業機器人加速“嵌入”制造業國際機器人聯合會(IFR)數據顯示,2021年我國機器人市場規模預計達到839億元,比2017年增長一倍以上,年均復合增長率20.2%。廣東是全國機器人生產和應用大省,已有省級機器人骨干(培育)企業超100家。今年以來,廣東機器人集群發展優勢明顯,工業機器人助推制造業轉型升級,“機器換人”正從試...

史海拾趣

問答坊 | AI 解惑

MSP430 應用技術資料.

MSP430 應用技術資料.…

查看全部問答∨

方便的食物垃圾處理系統IDEA78.com分享

Clive食物垃圾處理系統能很方便的處理掉家庭生活所產生的垃圾,從而供給更加方便和更加舒適的廚房生活。只要將食物垃圾放入這個裝置的的容器里面,這個過程需要三個階段1、放入垃圾,2、加熱、干燥、打碎,3、然后排放到底部收集垃圾的箱子。垃圾經 ...…

查看全部問答∨

如何編寫單片機的啟動文件?

今天開始玩論壇給我的開發板,我是用KEIL開發的,首先自己按照論壇有經驗開發者的指點下載了一個例程,工作的正常! 然后我就看程序的編寫,發現系統時鐘的中斷函數SysTick_Handler (void)是例程編寫的,但是沒有與中斷定義相關聯 于是我就查找, ...…

查看全部問答∨

CE中有沒有像GetKeyNameText一樣的函數

或者哪位大哥可以告訴我如果在CE下獲取鍵盤的VK?…

查看全部問答∨

招聘EE leader

各位童鞋,獵頭職位來啦!電子研發主管-外資醫療器械公司,主要負責呼吸麻醉機和監護儀相關的產品開發,精通模擬電路,很強的leadership,工作地點上海。如有興趣可直接@我。 The Section Manager Electronics is leading the team of electronics ...…

查看全部問答∨

KEIL,LPC2210下載片外FLASH失敗

 ads的工程移植到keil4.0+ULINK,LPC2210,smartarm2200開發板,想將程序下載到片外Flash(39VF1601)時出現如圖所示情況:keil設置情況如圖示。(軟件仿真通過,LPC2210無片內flash,外擴的2M片外flash39VF1601,開發板的跳線按要求進行了設置 ...…

查看全部問答∨

無線防碰撞問題

我想用CC1101做一個信號采集的小系統,有多個節點和一個集中器。節點采集信號并把信息發送給集中器。節點的發送是隨機的,如何能做到節點之間不會發生碰撞呢?請高手指教啊!…

查看全部問答∨

電源短路你怎么查?

每隔一段時間回來的板子就會出現這樣的問題,突然蹦出一塊板子電源短了。 運氣好碰到焊接問題能看出來,在不濟就開始拆電容,再不濟開始吹片子,最悲哀的一次把板子上的最后一個BGA拆下來之后不短了。 大家有什么更好的方法么?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 祁连县| 宝山区| 双流县| 墨脱县| 孟州市| 长乐市| 沙雅县| 黄山市| 鲁甸县| 盘山县| 安阳市| 施秉县| 彭水| 泰和县| 南郑县| 邯郸县| 庐江县| 浪卡子县| 元江| 浮山县| 大庆市| 宜阳县| 平果县| 同德县| 镇康县| 田林县| 新郑市| 大埔县| 阿坝县| 云南省| 白河县| 营山县| 九寨沟县| 新兴县| 双城市| 黄大仙区| 克拉玛依市| 方山县| 门源| 镇坪县| 常德市|