1.函數調用
fun0mov r4, #100bx lrget_MaxNumcmp r0, r1stmfd sp!, {r0-r12, lr} //入棧bl fun0 //調用fun0函數ldmfd sp!, {r0-r12, lr} //出棧movge r3, r0movlt r3, r1bx lr mainldr sp, =0x40001000mov r0, #100mov r1, #200mov r2, #100stmfd sp!, {r0-r12, lr}bl get_MaxNum ldmfd sp!, {r0-r12, lr}
2.指針
c語言: unsigned int *p匯編: ldr r1, =0x40000fff //給的地址 ldr r3,=0x11223344 //給的值str r3, [r1] //將r3存儲到r1里面 ldr r0, [r1] //將r1指向的值給到r0
3.調用.c文件函數
.c文件: extern int fun(int a, int b) {return a+b; }.s文件ldr sp, =0x40001000import fun //添加函數stmdf sp!, {r0-r12, lr}mov r0, #10 ;參數a = 10mov r1, #20 ;參數b = 20mov r2, #30 bl fun //調用函數ldmdf sp!, {r0-r12, lr}
注意:
1.a和b的參數取決于r0和r1,而與r2沒關系,若是給多個寄存器賦值,也只會按順序傳入參數
2.若是傳入的參數大于四個就得進行壓棧
.c文件: extern int fun(int a, int b, int c, int d, int e) {return a+b+c+d+e; }.s文件ldr sp, =0x40001000import fun //添加函數stmdf sp!, {r0-r12, lr}mov r0, #10 ;參數a = 10mov r1, #20 ;參數b = 20mov r2, #30mov r3, #40mov r4, #50stmdf sp!, {r4} bl fun //調用函數ldmdf sp!, {r4}ldmdf sp!, {r0-r12, lr}
4.arm啟動代碼
preserve8area reset, code, readonlycode32entryldr pc, =start_handerldr pc, =undefine_handerldr pc, =software_handerldr pc, =prefetch_handerldr pc, =data_handernopldr pc, =irq_handerldr pc, =fiq_hander //ARM 架構的異常向量表實現undefine_handerb undefine_handerimport software_vector //添加.c文件里面的software_vector函數 software_handerstmfd sp!, {r0-r12, lr}bl software_vector //調用.c文件里面的software_vector函數ldmfd sp!, {r0-r12, lr}bx lrprefetch_handerb prefetch_handerdata_handerb data_handerirq_handerb irq_handerfiq_handerb fiq_handerexport asm_swi_fun asm_swi_funswi #7 //軟件中斷 立即數執行對應服務bx lrstart_hander //上電或者復位的處理函數ldr sp, =0x40001000 //初始化spimport main //添加.c文件的main函數msr r0, cpsr //讀取當前程序狀態寄存器(CPSR)到 R0bic r0, r0, #(0x1f << 0)//清除 CPSR 的“模式位”(低 5 位,0x1f = 0b11111)bic r0, r0, #(1 << 7) //清除 CPSR 的“中斷禁止位 I”(第 7 位),允許 IRQ 中斷orr r0, r0, #(0x10 << 0)//設置“模式位”為 User 模式(0x10 = 0b10000,對應 User 模式)msr cpsr_c, r0 //將修改后的 R0 寫入 CPSR 的“控制位域”(cpsr_c 表示只更新控制位)ldr sp, =0x40001000sub sp, sp, #1024b mainend
4.1 ARM的異常向量表
異常向量地址 異常類型 代碼中的處理函數 作用 0x00000000 復位異常(Reset) start_hander
系統上電 / 復位時執行,初始化硬件 0x00000004 未定義指令異常 undefine_hander
執行無效指令時觸發(如未實現指令) 0x00000008 軟件中斷(SWI) software_hander
觸發 SWI 時跳轉到系統調用處理 0x0000000C 預取指異常 prefetch_hander
指令預取失敗(如地址無效) 0x00000010 數據訪問異常 data_hander
數據讀寫失敗(如越界、無權限) 0x00000014 保留(Reserved) nop
(空指令)ARM 架構預留,暫不使用 0x00000018 外部中斷(IRQ) irq_hander
外部硬件觸發中斷(如按鍵、定時器) 0x0000001C 快速中斷(FIQ) fiq_hander
高優先級中斷(如緊急硬件事件)