本帖最后由 seeblue 于 2012-7-12 16:27 编辑
算是一步一步重头学ARM了,很多基础的C语言或者芯片的参数不熟悉,只能细细研究,也把一些东西记下来,和大家共勉吧。
1、堆栈问题
看了几部ARM的书,都没有把堆栈的详细操作写出,后来在百度查了资料,然后根据2440INIT.S的程序进行学习对比。
堆栈和批量数据传输对比如下表: 寻址方式
| 说明
| pop
| =LDM
| push
| =STM
| FA
| 递增满
| LDMFA
| LDMDA
| STMFA
| STMIB
| FD
| 递减满
| LDMFD
| LDMIA
| STMFD
| STMDB
| EA
| 递增空
| LDMEA
| LDMDB
| STMEA
| STMIA
| ED
| 递减空
| LDMED
| LDMIB
| STMED
| STMDA |
例子解释: MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;假设原来SP指向地址为Add,现为Add-4 stmfd sp!,{r0} ; PUSH the work register to stack(lr does not push ; because it return original address) ; stmfd=stmdb,即减地址,再传值,现在SP指向Add-8, ; Add-8=(R0) ldr r0,=$HandleLabel ;load the address of HandleXXX to r0 ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack,现在SP地址 ;为Add-8, ;SP+4= Add-4,Add-4= (HandleLabel),SP 指向仍为 ;Add-8。 ldmfd sp!,{r0,pc} ; POP the work register and pc(jump to ISR) ; ldmfd= ldmia,先传值,后地址加4,即Add-8=(R0)→ ;R0,然后改址SP指向Add-4,再把Add-4= (HandleLabel) ;传给PC,最后改址SP→Add。完成PC到HandleLabel转 ;跳,而R0仍存回原值,SP仍指回原址。 MEND
|