歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 嵌入式Linux ARM匯編(三)——ARM匯編指令(一)

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

日期:2017/3/3 12:11:04   编辑:Linux技術

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

一、ARM匯編語言基本結構

AREA Init, CODE, READONLY
ENTRY
 Start
  LDR R0, =0x3FF5000
  LDR R1, 0xFF
  STR R1, [R0]
  LDR R0, =0x3FF5008
  LDR R1, 0x01
  STR R1, [R0]
  ... ... ... ... ... ...
  END

二、ARM處理器尋址方式

尋址方式是根據指令中給出的地址碼字段來實現尋找真實操作數地址的方式。ARM處理器有九種尋址方式,寄存器尋址、立即數尋址、寄存器偏移尋址為數據處理指令操作數尋址方式,寄存器間接尋址、基址尋址、多寄存器尋址、堆棧尋址、相對尋址為存儲器訪問指令操作數尋址方式。

1、寄存器尋址

操作數的值存在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執行時直接取出寄存器值操作。例如:
MOV R0,R1
SUB R0,R1,R2

2、立即尋址

立即尋址指令中的操作碼字段部分後面的地址碼部分就是操作數本身,即數據包含在指令當中。例如:
MOV R0,#0xff
立即數要以“#”為前綴,十六進制以“0x”表示

3、寄存器偏移尋址

寄存器偏移尋址是ARM指令集特有的尋址方式,當第2操作數是寄存器,在執行操作之前,可以做一次移位操作。
MOV R0,R2,LSL #3
ANDS R1,R1,R2,LSL R3

4、寄存器間接尋址

寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針。
LDR R1,[R2] ;將R2指向的單元中的數據保存再R1中
SWP R1,R1,[R2] ;將寄存器R1的值和R2指向的單元中進行內容交換

5、基址尋址

基址尋址就是將基址寄存器的內容與指令中給出的偏移量進行相加,形成操作數的有效地址。基址尋址用於訪問基址附近的存儲單元,常用於查表、數組操作以及功能不見寄存器訪問等。
LDR R2,[R3,#0x0c] ; 讀取R3 0x0c地址指向的存儲單元的內容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然後把R1的值寄存到R0所指向的單元中LDR R1,[R0,R3,LSL #1] ;將R0 R3*2地址上的單元的內容讀出,並存入R1中

6、多寄存器尋址

多寄存器尋址即一次可傳送幾個寄存器的值,允許一條指令傳送16個寄存器的任何子集或所有的存儲器。
LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數據讀出到R2---R7、R12中(R1自自動 )
STMIA R0!,{R2-R7,R12};將R2---R7、R12中的數據一次讀入到R0指向的單元中(R0自動 )

7、堆棧尋址

堆棧是一種按特定順序進行存取的存儲區,操作順序分為“先進後出”和“後進先出”,堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向的存儲區域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。
STMFD SP!,{R1-R7,LR} ;將R1---R7、LR入棧。滿遞減堆棧LDMFD SP!,{R1-R7,LR} ;數據出棧,放入R1---R7、LR寄存器,滿遞減堆棧

8、塊拷貝尋址

多寄存器傳送指令用於將一塊數據從存儲器的某一位置拷貝到另一位置。
STMIA R0!,{R1-R7} ;將R1~R7的數據保存到存儲器中。
;存儲指針在保存第一個值之後增加,
;增長方向為向上增長。
STMIB R0!,{R1-R7} ;將R1~R7的數據保存到存儲器中。
;存儲指針在保存第一個值之前增加,
;增長方向為向上增長。

9、相對尋址

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

三、指令格式

ARM指令的基本格式:
<opcode>[<con>][S] <Rd>, <Rn>{,operand2}opcode:指令助記碼,如:MOVcon:執行條件,如NE,EQS:是否影響CPSR寄存器的值,設置時影響CPSRRd:目標寄存器Rn:第一個操作數的寄存器operand2:第二個操作數條件碼表



本文出自 “生命不息,奮斗不止” 博客,請務必保留此出處http://9291927.blog.51cto.com/9281927/1785909
Copyright © Linux教程網 All Rights Reserved