珠海服務好的網(wǎng)站建設武漢seo
- 一、偽操作
- .global 全局
- .local 局部
- .equ 聲明
- .macro 子函數(shù)
- .if .endif 條件編譯
- .rept 重復操作
- .weak 弱化
- .word 申請一個字空間
- .byte 申請一個字節(jié)空間
- .align 地址對齊
- .arm ARM指令
- .thumb Thumb指令
- .text 代碼段
- .data 數(shù)據(jù)段
- .space 申請N個字節(jié)空間
- 二、C和匯編的混合編程
- 三、ATPCS協(xié)議
一、偽操作
偽操作:不會生成代碼,只是在編譯之前告訴編譯器怎么編譯 不同的編譯器偽操作也不同
GNU(gcc)的偽操作一般都以 ‘.’ 開頭
.global 全局
.global symbol@ 將symbol聲明成全局符號
.local 局部
.local symbol@ 將symbol聲明成局部符號
.equ 聲明
.equ DATA, 0xFF @ 似于#define DATA 0xFFMOV R1, #DATA
.macro 子函數(shù)
.macro FUNCMOV R1, #1MOV R2, #2.endmFUNC @ 調用FUNC函數(shù)
.if .endif 條件編譯
.if 0 @ 如果條件 0-假, 1-真 MOV R1, #1MOV R2, #2.endif
.rept 重復操作
.rept 3 @ 將下面這兩行代碼重復執(zhí)行三次MOV R1, #1MOV R2, #2.endr
.weak 弱化
@.weak symbol@ 弱化一個符號,即告訴編譯器即便沒有這個符號也不要報錯.weak funcB func
.word 申請一個字空間
@ .word VALUE@ 在當前地址申請一個字的空間并將其初始化為VALUEMOV R1, #1.word 0xFFFFFFFFMOV R2, #2
.byte 申請一個字節(jié)空間
@ .byte VALUE @ 在當前地址申請一個字節(jié)的空間并將其初始化為VALUEMOV R1, #1.byte 0xFF
.align 地址對齊
@ .align N@ 告訴編譯器后續(xù)的代碼2的N次方對其.align 4@ 下面這條指令將會從2^4 = 16,0x16地址空間開始存儲MOV R2, #2
.arm ARM指令
.arm@ 告訴編譯器后續(xù)的代碼是ARM指令
.thumb Thumb指令
.thumb@ 告訴編譯器后續(xù)的代碼是Thumb指令
.text 代碼段
.text @ 定義一個代碼段
.data 數(shù)據(jù)段
.data @ 定義一個數(shù)據(jù)段
.space 申請N個字節(jié)空間
@ .space N, VALUE@ 在當前地址申請N個字節(jié)的空間并將其初始化為VALUEMOV R1, #1.space 12, 0x12@ 32位的處理器,0x4 — 0x16 地址空間將會全部存儲12MOV R2, #2
二、C和匯編的混合編程
C和匯編的混合編程原則:在哪種語言環(huán)境下符合哪種語言的語法規(guī)則
- 在匯編中將C中的函數(shù)當做標號處理
- 在C中將匯編中的標號當做函數(shù)處理
- 在C中內聯(lián)的匯編當做C的語句來處理
方式一:匯編語言調用(跳轉)C語言
匯編中:MOV R1, #1MOV R2, #2BL func_c @ 將會跳到C語言代碼中MOV R3, #3C語言中:void func_c() {int a;}
方式二:C語言調用(跳轉)匯編語言
C語言中:void func_c() {int a;FUNC_ARM(); //將會跳轉到匯編指令中}
匯編中:MOV R1, #1MOV R2, #2
.global FUNC_ARM @ 全局變量
FUNC_ARM:MOV R3, #3
方式三:C內聯(lián)(內嵌)匯編
asm( “匯編指令\n” );
C語言中:void func_c(void){int a;// C內聯(lián)(內嵌)匯編 asm("MOV R6, #6\n""MOV R7, #7\n");}
三、ATPCS協(xié)議
ATPCS協(xié)議(ARM-THUMB Procedure Call Standard)
ATPCS協(xié)議主要內容
-
棧的種類
1.1使用滿減棧 -
寄存器的使用
2.1 R15用作程序計數(shù)器,不能作其他用途
2.2 R14用作鏈接寄存器,不能作其他用途
2.3 R13用作棧指針,不能作其他用途
2.4 當函數(shù)的參數(shù)不多于4個時使用R0-R3傳遞,當函數(shù)的參數(shù)多于4個時,多出的部分用棧傳遞
2.5 函數(shù)的返回值使用R0傳遞
2.6 其它寄存器主要用于存儲局部變量