小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ARM中的

 最初九月雪 2017-04-13

一. 帶點(diǎn)的(一般都是ARM GNU偽匯編指令)


1. ".text"、".data"、".bss"

依次表示的是
“以下是代碼段”,
“以下是初始化數(shù)據(jù)段”,
“以下是未初始化數(shù)據(jù)段”。

2.".global"

定義一個(gè)全局符號(hào),通常是為ld使用。比如經(jīng)??吹降?/span>

.global _start

3.".ascii"、".byte"、".short"、".int"、".long"、".word"、".quad"

定義一個(gè)字符串,并為它分配空間
定義一個(gè)字節(jié),并為它分配空間,占單字節(jié),0x34
定義一個(gè)短整型,并為它分配空間,占雙字節(jié),0x1234
定義一個(gè)整型,并為它分配空間,占四字節(jié),0x12345678
定義一個(gè)長(zhǎng)整型,并為它分配空間,占四字節(jié),0x12345678
定義一個(gè),并為它分配空間,
定義一個(gè),并為它分配定義,占八字節(jié),...
比如
.long 0x22011110//BWSCON
.long 0x00000700//BANKCON0
...

4.".abort"

停止匯編

5.".align"

.align absexpr1,absexpr2

以某種對(duì)齊方式,在未使用的存儲(chǔ)區(qū)域填充值. 第一個(gè)值表示對(duì)齊方式,4, 8,16或32. 第二個(gè)表達(dá)式值表示填充的值

6.".if .else .endif"

.if

.else

.endif:支持條件預(yù)編譯

7.".include"

.include "file":包含指定的頭文件, 可以把一個(gè)匯編常量定義放在頭文件中

8.".comm"

.comm  symbol, length:

在bss段申請(qǐng)一段命名空間,該段空間的名稱叫symbol, 長(zhǎng)度為length. Ld連接器在連接會(huì)為它留出空間

9.".equ"

.equ symbol, expression: 把某一個(gè)符號(hào)(symbol)定義成某一個(gè)值(expression).該指令并不分配空間,相當(dāng)于C語(yǔ)言中的#define。例如

.equ aaa,0x20000000

10.".macro .endm"

.macro: 定義一段宏代碼,.macro表示代碼的開始,.endm表示代碼的結(jié)束,.exitm跳出宏, 示例如下:

.macro SHIFTLEFT a, b.if \b < 0

mov \a, \a, ASR #-\b

.exitm

.endif

mov \a, \a, LSL #\b

.endm

11.".req"

name .req register name: 為寄存器定義一個(gè)別名

12.".code"

.code [16|32]: 指定指令代碼產(chǎn)生的長(zhǎng)度, 16表示Thumb指令, 32表示ARM指令

13.".ltorg"

.ltorg: 表示當(dāng)前往下的定義在歸于當(dāng)前段,并為之分配空間


二.帶下滑線的

1._start

匯編程序的缺省入口,但是可以更改,想要更改其他標(biāo)志,到相應(yīng)的鏈接腳本中去用ENTRY指明其他入口標(biāo)志。標(biāo)號(hào)可以直接認(rèn)為是地址。


三.不帶點(diǎn)的

1.mov--數(shù)據(jù)傳送指令

它的傳送指令只能是把一個(gè)寄存器的值(要能用立即數(shù)表示)賦給另一個(gè)寄存器,或者將一個(gè)常量賦給寄存器,將后邊的量賦給前邊的量,比如

mov r1,r2

mov r1,#4096

這個(gè)立即數(shù)是小于0xff(65535)的數(shù),如果大于65535,則用ldr指令賦值

2.b、bl--相對(duì)跳轉(zhuǎn)指令

b只是跳轉(zhuǎn),而bl除跳轉(zhuǎn)外還將返回地址(bl的下一條指令的地址)保存到lr寄存器中。其中跳轉(zhuǎn)范圍是當(dāng)前指令的前后32M。

3.ldr、str--內(nèi)存訪問指令

ldr指令即可能是大范圍的地址讀取偽指令,也可能是內(nèi)存訪問指令,當(dāng)它的第二個(gè)參數(shù)之前有“=”時(shí),表示偽指令,否則是內(nèi)存訪問指令,比如

ldr r0, =0x53000000//r0=0x53000000

str r1, [r2, #4]         // 將r1的數(shù)據(jù)保存到地址為r2+4的內(nèi)存單元中

str r1, [r2]                // 將r1的數(shù)據(jù)保存到地址為r2的內(nèi)存單元中

str r1, [r2], #4         // 將r1的數(shù)據(jù)保存到地址為r2的內(nèi)存單元中,然后r2=r2+4

ldr r1, [r2,#4]         // 將地址為r2+4的內(nèi)存單元數(shù)據(jù)讀取到r1

ldr r1, [r2]             // 將地址為r2的內(nèi)存單元數(shù)據(jù)讀取到r1中

ldr r1, [r2], #4         // 將地址為r2的內(nèi)存單元數(shù)據(jù)讀取到r1中,然后r2=r2+4

作為變址方式有如下分類:


當(dāng)ldr作為大范圍地址讀取偽指令,LDR偽指令用于加載32們的立即數(shù)或一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或者M(jìn)VN的范圍,剛使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入字池,并使用一 條程序相對(duì)偏移的LDR指令從文字池讀出常量。

作為寄存器的尋址,寄存器的間接尋址的3種方式


4.adr--小范圍的地址讀取(只有兩個(gè)參數(shù))

ADR指令將基于PC相對(duì)偏移的地址值讀取到寄存器中,在編譯源程序時(shí)ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來(lái)實(shí)現(xiàn)該ADR偽指令的功能,若不能用一條指令實(shí)現(xiàn),剛產(chǎn)生錯(cuò)誤,編譯失敗。比如

adr r0, delay//將標(biāo)號(hào)delay的地址賦給r0

5.ldmia--多寄存器尋址

一條指令可以完成多個(gè)寄存器值的傳遞,可以完成最多16個(gè)通用寄存器值的傳遞。比如

ldmia r0, [r1, r2, r3, r4]

;r1 <- [r0]

;r2 <- [r0+4]

;r3 <- [r0+4*2]

;r4 <- [r0+4*3]

6.nop--空操作指令

什么都不做,可以用作延時(shí)。

7.add,sub--加法減法指令

共三個(gè)參數(shù),將后邊的兩個(gè)參數(shù)操作并賦給第一個(gè)參數(shù),比如

add r1, r1, r0//r1=r1+r0

sub r1, r1, r2//r1=r1-r2

//這兩句的結(jié)果就是r1=r1+r0-r2

8.asr,lsl,lsr,ror,rrx,type rs

對(duì)于arm指令的基本格式如下:


對(duì)于operand2參數(shù),如果能靈活使用,代碼效率會(huì)很高。


桶型一位寄存器操作



9.cmp--比較指令

cspr

10.eq,ne,ce等--指令的條件域

所有的ARM指令都可以條件執(zhí)行:指令的執(zhí)行與否取決于CPSR寄存器的N,Z,CandV
每一條ARM指令包含4位的條件碼位于指令的最高4位[31:28],條件碼共16種,每個(gè)條件碼可以用2個(gè)字符表示,這兩個(gè)字符可以添加在指令助記符的后邊和指令同時(shí)使用。
指令最高4位代表的條件域如下表

條件碼

助記符后綴

標(biāo)志

含義

0000

EQ

Z置位

相等

0001

NE

Z清零

不相等

0010

CS

C置位

無(wú)符號(hào)數(shù)大于或等于

0011

CC

C清零

無(wú)符號(hào)數(shù)小于

0100

MI

N置位

負(fù)數(shù)

0101

PL

N清零

正數(shù)或零

0110

VS

V置位

溢出

0111

VC

V清零

未溢出

1000

HI

C置位Z清零

無(wú)符號(hào)數(shù)大于

1001

LS

C清零Z置位

無(wú)符號(hào)數(shù)小于或等于

1010

GE

N等于V

帶符號(hào)數(shù)大于或等于

1011

LT

N不等于V

帶符號(hào)數(shù)小于

1100

GT

Z清零且(N等于V)

帶符號(hào)數(shù)大于

1101

LE

Z置位或(N不等于V)

帶符號(hào)數(shù)小于或等于

1110

AL

忽略

無(wú)條件執(zhí)行

例如

cmp r0, r1

beq func//如果r1==r0,則跳轉(zhuǎn)到func標(biāo)志地址上去

cmp r0, r1

beq func//如果r1!=r0,則跳轉(zhuǎn)到func標(biāo)志地址上去

11.R13,R14寄存器--sp,lr

sp是堆棧指針,lr是鏈接地址寄存器。R13作為sp,R14作為lr。
對(duì)于鏈接地址寄存器,它的作用有兩個(gè):
【1】當(dāng)使用bl指令調(diào)用子程序時(shí),系統(tǒng)會(huì)自動(dòng)將 bl指令的下一條指令的地址存入lr中。
執(zhí)行過程如下圖

①,程序A正常執(zhí)行到BL Lable然后轉(zhuǎn)到程序B中去
②,系統(tǒng)將BL Lable的下一句NEXT的地址放到LR中去
③,執(zhí)行完B的程序后,執(zhí)行一個(gè)MOV PC,LR將NEXT的地址給到當(dāng)前pc值
④,繼續(xù)執(zhí)行程序A下面的語(yǔ)句

【2】當(dāng)發(fā)生異常時(shí),系統(tǒng)自動(dòng)將異常的返回地址放入R14中(有些異常有一個(gè)小的固定的偏移量)。

12.邏輯運(yùn)算指令--

;按位與

AND Rd, Rn                                 ; Rd &= Rn

AND.W Rd, Rn, #imm12           ; Rd = Rn & imm12

AND.W Rd, Rm, Rn                    ; Rd = Rm & Rn

 

;按位或

ORR Rd, Rn                                  ; Rd |= Rn

ORR.W Rd, Rn, #imm12            ; Rd = Rn | imm12

ORR.W Rd, Rm, Rn                     ; Rd = Rm | Rn

 

;按位清零

BIC Rd, Rn                                    ; Rd &= ~Rn

BIC.W Rd, Rn, #imm12             ; Rd = Rn & ~imm12

BIC.W Rd, Rm, Rn                      ; Rd = Rm & ~Rn

 

;按位或反

ORN.W Rd, Rn, #imm12          ; Rd = Rn | ~imm12

ORN.W Rd, Rm, Rn                   ; Rd = Rm | ~Rn

 

;按位異或

EOR Rd, Rn                                 ; Rd ^= Rn

EOR.W Rd, Rn, #imm12           ; Rd = Rn ^ imm12

EOR.W Rd, Rm, Rn                    ; Rd = Rm ^ Rn

 

;邏輯左移

LSL Rd, Rn, #imm5                  ; Rd = Rn<<imm5

LSL Rd, Rn                                 ; Rd <<= Rn

LSL.W Rd, Rm, Rn                   ; Rd = Rm<<Rn

 

;邏輯右移

LSR Rd, Rn, #imm5                ; Rd = Rn>>imm5

LSR Rd, Rn                               ; Rd >>= Rn

LSR.W Rd, Rm, Rn                  ; Rd = Rm>>Rn

 

;算術(shù)右移

ASR Rd, Rn, #imm5                 ; Rd = Rn>> imm5

ASR Rd, Rn                                ; Rd =>> Rn

ASR.W Rd, Rm, Rn                   ; Rd = Rm>>Rn

 

;循環(huán)右移

ROR Rd, Rn ;

ROR.W Rd, Rm, Rn ;


四.匯編中的注釋

(1) @ 表示注釋從當(dāng)前位置到行尾的字符.

(2) # 注釋掉一整行.

(3) ; 新行分隔符.

五.匯編中的常數(shù)

(1)十進(jìn)制數(shù)以非0數(shù)字開頭,如:123和9876;

(2)二進(jìn)制數(shù)以0b開頭,其中字母也可以為大寫; 

(3)八進(jìn)制數(shù)以0開始,如:0456,0123;

(4)十六進(jìn)制數(shù)以0x開頭,如:0xabcd,0X123f;

(5)字符串常量需要用引號(hào)括起來(lái),中間也可以使用轉(zhuǎn)義字符,如: “You are welcome!/n”;

(6)當(dāng)前地址以“.”表示,在匯編程序中可以使用這個(gè)符號(hào)代表當(dāng)前指令的地址;

(7)表達(dá)式:在匯編程序中的表達(dá)式可以使用常數(shù)或者數(shù)值, “-”表示取負(fù)數(shù), “~”表示取補(bǔ),“<>”表示不相等,其他的符號(hào)如:+、-、*、/、%、<、<<、>、>>、|、&、^、!、==、>=、<=、&&、||跟C語(yǔ)言中的用法相似。

六.匯編程序較好的格式




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多