2010-第3章嵌入式ARM指令系统-补充.ppt_第1页
2010-第3章嵌入式ARM指令系统-补充.ppt_第2页
2010-第3章嵌入式ARM指令系统-补充.ppt_第3页
2010-第3章嵌入式ARM指令系统-补充.ppt_第4页
2010-第3章嵌入式ARM指令系统-补充.ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第3章 ARM指令系统-补充,李建义,ARM指令总结,指令的基本格式: 标号 助记符条件s 目的寄存器 源寄存器1,源操作数2 常用指令: ADD,ADC,SUB,SBC,MUL,MLA CMP B,BL,BX MOV LDRB/H,STRB/H,ARM指令总结,ARM指示符 AREA ENTRY END 伪指令 ADR、ADRL、LDR MACRO、MEND,汇编的编程风格,标号和注释要顶格书写,但指令和伪指令不能顶格书写,需要前导空格 注释前加“;”,汇编程序举例,COUNT EQU 0 x30001010 AREA Example1,CODE,READONLY ENTRY CODE32

2、START LDR R1,=COUNT MOV R0,#0 STR R0,R1,汇编程序举例,LOOP LDR R1,=COUNT LDR R0,R1 ADD R0,R0,#1 CMP R0,#10 MOVHS R0,#0 STR R0,R1 B LOOP END,程序的调试窗口,寄存器窗口,存储器Memory窗口,调试按钮,要查看的存储器起始地址,Step in 到函数内部执行,Step 不进入函数内部执行,Run to cursor 执行到光标处,C与汇编混合调用规则(1) 寄存器使用规则,子程序间通过寄存器R0R3来传递参数(A0A3)。被调用子程序返回前无需恢复寄存器R0R3的值。 在

3、子程序中,使用R4R11保存局部变量(V1V8)。若子程序中使用了寄存器V1V8中的某些寄存器,子程序进入时必须保存这些寄存器内容,返回时必须恢复这些寄存器内容。,C与汇编混合调用规则(1) 寄存器使用规则,R13用作数据栈指针,记做SP,在进入子程序时的值和退出子程序时的值必须相等。 R14保存子程序返回地址,R15是程序计数器,(2)参数传递规则,当函数的参数不超过4个时,可以使用寄存器R0R3来传递参数 参数超过4个时,将多余的数据用数据栈进行传递,入栈的顺序与参数顺序恰好相反,即最后 一个字数据先入栈 子程序结果返回 返回32位的数,利用R0 返回64位的数时,使用R0、R1,(3)数

4、据栈使用规则,ATPCS规定数据栈为FD(Full Descendnig)类型,地址减小方向,已使用的栈空间,未使用的栈空间,栈基地址,栈指针,栈的上限地址,栈中数据,3.从汇编程序中访问C程序变量,在C程序中声明的全局变量可以在汇编程序中通过地址访问,具体访问方式如下: 使用IMPORT伪操作声明该全局变量 使用LDR指令读取该全局变量的内存地址 根据该数据类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值,C与汇编的混合编程,1.内嵌汇编 _asm 汇编指令 ,void my_strcpy(char *src, const char *dst) int c

5、h; _asm loop: LDRB ch, src, #1 STRB ch, dst, #1 CMP ch, #0 BNE loop ,2.从汇编程序中访问C程序变量,在C程序中声明的全局变量可以在汇编程序中通过地址访问。 使用IMPORT伪操作声明该全局变量 使用LDR指令读取该全局变量的内存地址:LDR R1,=变量名 根据该数据类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值,C与汇编混合调用2.汇编语言程序中调用C语言函数,按照参数使用规则将参数存入R0-R3,SP, 内嵌汇编调用C函数 BL 函数名,参数表 不同文件中调用 汇编文件.S C文件.

6、C,IMPORT 函数名 设置参数R0-R3,SP BL 函数名,extern 返回值 函数名(参数) ,3.C程序中调用汇编程序的子函数,汇编程序的设计要遵守ATPCS,保证程序调用时参数的正确传递 汇编文件.s C文件.c,AREA 段名 CODE,READONLY EXPORT 函数名,extern 函数名(参数); 函数名(实参);,内嵌汇编调用C函数,#include void my_strcpy(char *src, const char *dst) int ch; _asm loop: LDRB ch, src, #1 STRB ch, dst, #1 CMP ch, #0 BN

7、E loop ,int main(void) const char *a = Hello World; char b20; _asm MOV R0, a MOV R1, b BL my_strcpy,R0,R1 printf(Original string: %sn,a); printf(Copied string: %sn,b); return 0; ,例子:字符串复制strtest.c,extern void strcopy(const char *s, char *d); int main( ) const char *srcstr =“Hello World.; char dststr

8、20; strcopy(srcstr ,dststr ); return 0; ,例子:字符串复制strcopy.s,AREA SCopy, CODE, READONLY EXPORT strcopy strcopy LDRB r2, r0,#1 STRB r2, r1,#1 CMP r2, #0 BNE strcopy MOV pc,lr END,strcopy(srcstr ,dststr );,调试窗口,汇编文件中调用C函数test5.c,;汇编程序调用C程序g()计算5个整数i、2*i、3*i、4*i、5*i EXPORT f AREA f, CODE, READONLY IMPORT

9、 g IMPORT globl STR lr, sp, #-4! ADD r1, r0, r0 ADD r2, r1,r0 ADD r3, r1,r2 STR r3, sp, #-4! ADD r3, r1, r1 BL g LDR r1, =globl STR r0, r1 ADD sp, sp, #4 LDR pc, sp,#4 END,#include extern int g(int a , int b , int c, int d, int e) return a+b+c+d+e; /*/ unsigned long globl; extern void f(int); int main(void) globl = 0; f(4); printf(g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论