| 本帖最后由 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 
 |