使用ads编写arm7程序步步学

来源:互联网 发布:象人电影知乎 编辑:程序博客网 时间:2024/04/27 22:43

首先建立工程开始打开ads->codeWarrior
File->New->Project->ARM Executable Image 选择工程目录建立的是*.mcp工程文件
接下和vc一样创建文件这里文件 .s(asm汇编文件).c(标准c).cpp(c++文件)
注意不同文件调用的编译器不同所以注意文件后缀名
建一个Init.s入口初始文件所有调用将从这个文件入口
File->New->File->TextFile 选择目录建立文件init.s
下面是代码(我做了精简)

  IMPORT Main //注意命令行是不能顶格的否则编译不认操作码 倒入函数类似include概念 
  AREA Init,CODE,READONLY //这是宏汇编语法表示代码段名称及属性READONLY 
  ENTRY     //入口宏 
  
  LDR R13, =0x8000  //定义SP
  
  B Main     //跳转到Main开始正式的c文件下操作 


  END      //结束宏
  
  
再同样建立一个testlib.s测试lib的库 书写一个strcpy函数

 EXPORT strcpy     //导出lib中的函数名类似于extern或者public功能
 
   AREA TESTLIB,CODE,READONLY //同上
 
   
strcpy       //标号定义必须顶格
   LDRB r2, [r1, #0]   //下面是实现strcpy过程 
   CMP  r2, #0
 BEQ cpy_end
   add r1, r1, #1
   STRB r2, [r0], #1
   B strcpy     
   
cpy_end
 mov r0, #1
 mov pc, r14      //实现结束 
   
  END

同样建立main.c的主c文件
书写代码 
int Main()      //看到Main了么,与标准c不同可以自己定义入口 
{ 
 char buf[10] = {0};   //同标准c下书写一样不过所有库函数要自己实现当然不是指strcpy这些
        //是对于printf,串口之类硬件的
 char *pstr = "123456789";   
 strcpy( buf, pstr);   //调用 
    
 return 1;
 
}

整个就完成了可以编译然后运行使用AXD进入调试阶段自己搞  

介绍一下ACPS
APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。
APCS 定义了:

对寄存器使用的限制。
使用栈的惯例。
在函数调用之间传递/返回参数。
可以被‘回溯’的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。
APCS 标准
总的来说,有多个版本的 APCS (实际上是 16 个)。我们只关心在 RISC OS 上可能遇到的。
APCS-A
就是 APCS-Arthur;由早期的 Arthur 所定义。它已经被废弃,原因是它有不同的寄存器定义(对于熟练的 RISC OS 程序员它是某种异类)。它用于在 USR 模式下运行的 Arthur 应用程序。不应该使用它。

sl = R13, fp = R10, ip = R11, sp = R12, lr = R14, pc = R15。
PRM (p4-411) 中说“用 r12 作为 sp,而不是在体系上更自然的 r13,是历史性的并先于 Arthur 和 RISC OS 二者。”
栈是分段的并可按需要来扩展。
26-bit 程序计数器。
不在 FP 寄存器中传递浮点实参。
不可重入。标志必须被恢复。
APCS-R
就是 APCS-RISC OS。用于 RISC OS 应用程序在 USR 模式下进行操作;或在 SVC 模式下的模块/处理程序。

sl = R10, fp = R11, ip = R12, sp = R13, lr = R14, pc = R15。
它是唯一的最通用的 APCS 版本。因为所有编译的 C 程序都使用 APCS-R。
显式的栈限制检查。
26-bit 程序计数器。
不在 FP 寄存器中传递浮点实参。
不可重入。标志必须被恢复。
APCS-U
就是 APCS-Unix,Acorn 的 RISCiX 使用它。它用于 RISCiX 应用程序(USR 模式)或内核(SVC 模式)。

sl = R10, fp = R11, ip = R12, sp = R13, lr = R14, pc = R15。
隐式的栈限制检查(使用 sl)。
26-bit 程序计数器。
不在 FP 寄存器中传递浮点实参。
不可重入。标志必须被恢复。
APCS-32
它是 APCS-2(-R 和 -U)的一个扩展,允许 32-bit 程序计数器,并且从执行在 USR 模式下的一个函数中退出时,允许标志不被恢复。其他事情同于 APCS-R。
Acorn C 版本 5 支持生成 32-bit 代码;在用于广域调试的 32 位工具中,它是最完整的开发发行。一个简单的测试是要求你的编译器导出汇编源码(而不是制作目标代码)。你不应该找到:
MOVS PC, R14
或者
LDMFD R13!, {Rx-x, PC}