天嵌 ARM开发社区

 找回密码
 注册
查看: 3240|回复: 1

裸机学习记录

[复制链接]
seeblue 发表于 2012-7-12 16:21:20 | 显示全部楼层 |阅读模式
本帖最后由 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

 楼主| seeblue 发表于 2012-7-26 17:31:30 | 显示全部楼层
现在有2个问题:
第一个:

                MACRO
        MOV_PC_LR
                [ THUMBCODE    ;  {   if THUMBCODE
         
            bx lr              ;         bx lr
                |              ;      else
            mov        pc,lr          ;         mov pc,lr
                ]              ;       endif
        MEND                   ;   }

                MACRO
        MOVEQ_PC_LR
                [ THUMBCODE
        bxeq lr
                |
            moveq pc,lr
                ]
        MEND


为什么子程序返回分2种情况,这段代码针对什么情况,实例?
第二个:
IsrIRQ
        sub        sp,sp,#4       ;reserved for PC
        stmfd        sp!,{r8-r9}

        ldr        r9,=INTOFFSET
        ldr        r9,[r9]
        ldr        r8,=HandleEINT0
        add        r8,r8,r9,lsl #2                   ;为何要R9*4?
        ldr        r8,[r8]
        str        r8,[sp,#8]
        ldmfd        sp!,{r8-r9,pc}

        LTORG

r9地址为什么要*4?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-8-3 16:15 , Processed in 2.035673 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表