S3C2440 汇编格式

AREALED,CODE,READONLY
ENTRY
CODE32
IMPORT Main ; 声明C程序中的Main()函数
START
BL Disable_Watch_Dog
LDR SP,=1024*4
BL Main
halt_loop
B halt_loop
Disable_Watch_Dog         ;关闭看门狗,否则一直重启
LDR R0,=0x53000000
MOV R1,#0x0
STR R1,[R0]
MOV PC,lr;返回

END



Arm 体系结构3种执行流程:

1 顺序执行

2 跳转执行

3 异常中断执行

 

Arm 子程序调用使用命令 BL 子程序名称

子程序调用示例:

              AREA Init , CODE , READONLY

              ENTRY

Start

              LDR R0 , =0x3FF5000

              LDR R1 , 0xFF

              STR R1 , [R0]

              LDR R0 , =0x3FF5008

              LDR R1 , 0x01

              STR R1 , [R0]

              BL PRINT_TEXT

              ┉┉

PRINT_TEXT

              ┉┉

              MOV PC,LR

              ┉┉

           END



在C\C++程序中使用内嵌的汇编指令的语法格式

      在ARM C语言程序中,使用关键字__asm来标识一段汇

编指令程序。

              __asm      ;2 个下划线

              {

                  汇编语言程序

                  ~~~~~~~~

                  汇编语言程序

              }

其中:如果一行中有多个汇编指令,指令之间使用分号(;)分开。

         在一条指令占多行,要使用续行符号(\).

在C/C++程序中内嵌汇编指令注意事项:

o      必须小心使用物理寄存器,如R0~R3,SP,LR 和CPSR 中的N,Z,C,V 标志位.因为计算汇编代码中的C 表达式时,可能会使用这些物理寄存器,并会修改N,Z,C,V标志位。

              __asm

              {

              MOV R0,x

              ADD y,R0,x/y //计算x/y 时R0 会被修改

              }

       在计算x/y 时R0 会被修改,从而影响R0+x/y 的结果.用一个C 程序的变量代替

R0就可以解决这个问题:

              __asm

             {

              MOV var,x

              ADD y,var,x/y

             }

       内嵌汇编器探测到隐含的寄存器冲突就会报错.

o      不要使用寄存器代替变量.尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量.

              int bad_f(int x) //x 存放在R0 中

              {

                     __asm

                  {

                    ADD R0,R0,#1 //发生寄存器冲突,实际上x 的值没有变化

                  }

                  return(x);

              }

         尽管根据编译器的编译规则似乎可以确定R0 对应x,但这样的代码会使内嵌汇编器认为

发生了寄存器冲突.用其他寄存器代替R0 存放参数x,使得该函数将x 原封不动地返回.

          这段代码的正确写法如下:

              int bad_f(intx)

                {

                     __asm

                 {

                    ADD x,x,#1

                  }

                  return(x)

              }

从汇编程序中访问C程序变量

在C程序中声明的全局变量可以被汇编程序通过地址间接访问。具体访问方

法如下:

o      使用IMPORT伪指令声明这个全局变量。

o      使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址存放在程序的数据缓冲池中。

o      根据该数据类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值。

              AREA  globals,CODE,READONLY

              EXPORT asmsub

              IMPORT  glovbvar;声明外部变量glovbvar

       asmsub

              LDR R1,=glovbvar;装载变量地址

              LDR R0,[R1] ;读出数据

              ADD R0,R0,#1;加1 操作

              STR R0,[R1];保存变量值

              MOV PC, LR

              END

C程序与汇编程序互相调用规则

寄存器的使用规则

  1. 子程序间通过寄存器R0~R3来传递参数。
  2. 在子程序中,使用寄存器R4~R11来保存局部变量。
  3. 寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。
  4. 寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。 
  5. 寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。
  6. 寄存器R15是程序计数器,记作PC

 

 

*.axf (下载到sdram 里面调试(AXD))  

ARM fromelf(转化)   ---->    *.bin  *.elf  *.hex  *.i32 烧写到flash里面保存 

 

 

1.       将映象文件(*.axf)下载到SDRAM内调试,工具为JTAG 板 或者仿真器.

RO BASE: 设置SDRAM内的地址,可以设置SDRAM 的首地址,或者是靠近首

地址值的地址值,RO BASE的值一定要按照字对齐.

RW BASE: 也可以不设置,如果要设置,RW BASE –RO BASE >映象文件的大下

最好不设置, 值一定要按照字对齐.

 

2.       将映象文件(*.bin *.hex) 烧写到nor flash 内

RO BASE: 设置flash 首地址(0x00000000), 值一定要按照字对齐.

RW BASE: 一定要设置,设置的地址值在SD RAM 内, 值一定要按照字对齐.

 

IMAGE ENTRY POINT: 可以不设置,如果设置就和RO BASE的值.

 

PLACE AT BEGINNING OF IMAGE

Object/Symbol:填写映象文件中,第一个要执行的源文件的目标文件.

(异常中断的跳转函数)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值