歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

嵌入式Linux ARM匯編(三)——ARM匯編指令(三)

嵌入式Linux ARM匯編(三)——ARM匯編指令(三)

六、ARM跳轉指令

1、B 跳轉指令

跳轉到指定的地址執行程序,指令格式:B[con] labelB helloB #0x30008000

2、BL 帶鏈接的跳轉指令

將下一條指令的地址拷貝到R14(LR)鏈接寄存器中,然後跳轉到指定地址運行程序,指令格式:BL[con] labelBL helloBL用於子函數的調用

3、BX 帶狀態切換的跳轉指令

BX指令的格式為:BX{條件} 目標地址

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

七、程序狀態寄存器訪問指令

1、MRS指令

MRS指令的格式為:MRS{條件} 通用寄存器 程序狀態寄存器(CPSR或SPSR)

MRS指令用於將程序狀態寄存器的內容傳送到通用寄存器中。該指令一般用在以下兩種情況:

Ⅰ.當需要改變程序狀態寄存器的內容時,可用MRS將程序狀態寄存器的內容讀入通用寄存器,修改後再寫回程序狀態寄存器。

Ⅱ.當在異常處理或進程切換時,需要保存程序狀態寄存器的值,可先用該指令讀出程序狀態寄存器的值,然後保存。

指令示例:

MRS R0,CPSR ;傳送CPSR的內容到R0

MRS R0,SPSR ;傳送 SPSR的內容到R0

2、MSR指令

MSR指令的格式為:MSR{條件} 程序狀態寄存器(CPSR或SPSR)_<域>,操作數

MSR指令用於將操作數的內容傳送到程序狀態寄存器的特定域中。其中,操作數可以為通用寄存器或立即數。<域>用於設置程序狀態寄存器中需要 操作的位,32位的程序狀態寄存器可分為4個域:

位[31:24]為條件位域,用f表示;

位[23:16]為狀態位域,用s表示;

位[15:8] 為擴展位域,用x表示;

位[7:0] 為控制位域,用c表示;

該指令通常用於恢復或改變程序狀態寄存器的內容,在使用時,一般要在MSR指令中指明將要操作的域。只有在特權模式下才可以修改狀態寄存器。

指令示例:

MSR CPSR,R0 ;傳送R0的內容到CPSR

MSR SPSR,R0 ;傳送R0的內容到SPSR

MSR CPSR_c,R0 ;傳送R0的內容到SPSR,但僅僅修改CPSR中的控制位域

八、ARM協處理器指令

1、CDP指令

CDP指令的格式為:CDP{條件} 協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2。

CDP指令用於ARM處理器通知ARM協處理器執行特定的操作,若協處理器不能成功完成特定的操作,則產生未定義指令異常。其中協處理器操作碼1和協處理 器操作碼2為協處理器將要執行的操作,目的寄存器和源寄存器均為協處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲器。

指令示例:

CDP P3,2,C12,C10,C3,4 ;該指令完成協處理器P3的初始化

2LDC指令

LDC指令的格式為:LDC{條件}{L} 協處理器編碼,目的寄存器,[源寄存器]

LDC指令用於將源寄存器所指向的存儲器中的字數據傳送到目的寄存器中,若協處理器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指 令為長讀取操作,如用於雙精度數據的傳輸。

指令示例:

LDC P3,C4,[R0] ;將ARM處理器的寄存器R0所指向的存儲器中的字數 據傳送到協處理器P3的寄存器C4中。

3STC指令

STC指令的格式為:

STC{條件}{L} 協處理器編碼,源寄存器,[目的寄存器]

STC指令用於將源寄存器中的字數據傳送到目的寄存器所指向的存儲器中,若協處理器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指 令為長讀取操作,如用於雙精度數據的傳輸。

指令示例:

STC P3,C4,[R0] ;將協處理器P3的寄存器C4中的字數據傳送到ARM處理 器的寄存器R0所指向的存儲器中。

4MCR指令

MCR指令的格式為:MCR{條件} 協處理器編碼,協處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協處理器操作碼2。

MCR指令用於將ARM處理器寄存器中的數據傳送到協處理器寄存器中,若協處理器不能成功完成操作,則產生未定義指令異常。其中協處理器操作碼1和協處理 器操作碼2為協處理器將要執行的操作,源寄存器為ARM處理器的寄存器,目的寄存器1和目的寄存器2均為協處理器的寄 存器。

指令示例:

MCR P3,3,R0,C4,C5,6 ;將ARM處理器寄存器R0中的數據傳送到協處 理器P3的寄存器C4和C5中。

5、MRC指令

MRC指令的格式為:MRC{條件} 協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2。

MRC指令用於將協處理器寄存器中的數據傳送到ARM處理器寄存器中,若協處理器不能成功完成操作,則產生未定義指令異常。其中協處理器操作碼1和協處理 器操作碼2為協處理器將要執行的操作,目的寄存器為ARM處理器的寄存器,源寄存器1和源寄存器2均為協處理器的寄存器。

指令示例:

MRC P3,3,R0,C4,C5,6 ;該指令將協處理器P3的寄存器中的數據傳送到 ARM處理器寄存器中。

九、異常產生指令

1SWI指令

SWI指令的格式為:SWI{條件} 24位的立即數

SWI指令用於產生軟件中斷,以便用戶程序能調用操作系統的系統例程。操作系統在SWI的異常處理程序中提供相應的系統服務,指令中24位的立即數指定用 戶程序調用系統例程的類型,相關參數通過通用寄存器傳遞,當指令中24位的立即數被忽略時,用戶程序調用系統例程的類型由通用寄存器R0的內容決定,同 時,參數通過其他通用寄存器傳遞。

指令示例:

SWI 0x02 ;該指令調用操作系統編號位02的系統例程。

2、BKPT指令

BKPT指令的格式為:BKPT 16位的立即數

BKPT指令產生軟件斷點中斷,可用於程序的調試。

十、數據交換指令

1SWP指令

SWP指令的格式為:SWP{條件} 目的寄存器,源寄存器1,[源寄存器2]

SWP指令用於將源寄存器2所指向的存儲器中的字數據傳送到目的寄存器中,同時將源寄存器1中的字數據傳送到源寄存器2所指向的存儲器中。顯然,當源寄存 器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內容。

指令示例:

SWP R0,R1,[R2] ;將R2所指向的存儲器中的字數據傳送到R0,同時將R1 中的字數據傳送到R2所指向的存儲單元。

SWP R0,R0,[R1] ;該指令完成將R1所指向的存儲器中的字數 據與R0中的數據交換。

2、SWPB指令

SWPB指令的格式為:SWP{條件}B 目的寄存器,源寄存器1,[源寄存器2]

SWPB指令用於將源寄存器2所指向的存儲器中的字節數據傳送到目的寄存器中,目的寄存器的高24清零,同時將源寄存 器1中的字節數據傳送到源寄存器2所指向的存儲器中。顯然,當源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內容。

指令示例:

SWPB R0,R1,[R2] ;將R2所指向的存儲器中的字節數據傳送到 R0,R0的高24位清零,同時將R1中的低8位數據傳送到R2所指向的存儲單元。

SWPB R0,R0,[R1] ;該指令完成將R1所指向的存儲器中的 字節數據與R0中的低8位數據交換。

十一、移位指令

1、LSL(或ASL)

LSL(或ASL)的格式為:通用寄存器,LSL(或ASL) 操作數

LSL(或ASL)可完成對通用寄存器中的內容進行邏輯(或算術)的左移操作,按操作數所指定的數量向左移位,低位用零來填充。 其中,操作數可以是通用寄存器,也可以是立即數(0~31)。

操作示例

MOV R0, R1, LSL #2 ;將R1中的內容左移兩位後傳送到R0 中。

2、LSR

LSR的格式為:通用寄存器,LSR 操作數

LSR可完成對通用寄存器中的內容進行右移的操作,按操作數所指定的數量向右移位,左端用零來填充。其中,操作數可以 是通用寄存器,也可以是立即數(0~31)。

操作示例:

MOV R0, R1, LSR #2 ;將R1中的內容右移兩位後傳送到R0中,左端用零來填充。

3、ASR

ASR的格式為:通用寄存器,ASR 操作數

ASR可完成對通用寄存器中的內容進行右移的操作,按操作數所指定的數量向右移位,左端用第31位的值來填充。其中,操作數可以是通用寄存器,也可以是立 即數(0~31)。

操作示例:

MOV R0, R1, ASR #2 ;將R1中的內容右移兩位後傳送到R0 中,左端用第31位的值來填充。

4、ROR

ROR的格式為:通用寄存器,ROR 操作數

ROR可完成對通用寄存器中的內容進行循環右移的操作,按操作數所指定的數量向右循環移位,左端用右端移出的位來填充。其中,操作數可以是通用寄存器,也 可以是立即數(0~31)。顯然,當進行32位的循環右移操作時,通用寄存器中的值不改變。

操作示例:

MOV R0, R1, ROR #2 ;將R1中的內容循環右移兩位後傳送到R0 中。

5、RRX

RRX的格式為:通用寄存器,RRX 操作數

RRX可完成對通用寄存器中的內容進行帶擴展的循環右移的操作,按操作數所指定的數量向右循環移位,左端用進位標志位C來填充。其中,操作數可以是通用寄 存器,也可以是立即數(0~31)。

操作示例:

MOV R0, R1, RRX #2 ;將R1中的內容進行帶擴展的循環右移兩位 後傳送到R0中。

本文出自 “生命不息,奮斗不止” 博客,請務必保留此出處http://9291927.blog.51cto.com/9281927/1785924

Copyright © Linux教程網 All Rights Reserved