ARM体系结构与编程学习(十)

第六章 ATPCS介绍

在汇编编译器中使用-apcs选项。

6.1.2寄存器使用规则

子程序使用R0~R3来传递参数。用R4~R11来保存局部变量,thumb使用R4~R7。R12记作IP,调用scratch寄存器。R13记作SP,用作数据堆栈指针。R14记作LR,用作保存子程序的返回地址。R15记作PC,是程序计数器。

6.1.3数据栈使用规则

有四种堆栈方向:

FD、FA、ED、EA

ATPCS规定使用FD

6.1.4参数传递规则

1、参数可变:参数不超过4,使用R0~R3,超过则将多的参数送到数据栈中保存

2、参数固定:第一个参数,通过R0~R3,其他参数使用数据栈。

3、结果返回:结果为32位整数,使用R0;结果为64位,使用R0和R1;结果为浮点,使用f0、d0或者s0;

第七章  ARM和Thumb混合编程

状态切换指令:

BLX 、BX      目标地址

LDR、LDM及POP  向PC寄存器赋值

         AREA  AddReg  ,CODE ,READONLY

          ENTRY

main

         ADR  R0,ThumbProg+1  ;存储单元的地址肯定是偶数,也就是最低位肯定是0,但ARM与thumb之间的切换是

                                         ;通过Rn的最低位来判断的,1为thumb,0为ARM

         BX     R0                   ;跳转到ThumbPro,并且程序切换到Thumb状态

             CODE16

ThumbProg

              MOV  R2,#2

              MOV R3,#3

              ADD  R2,R2,R3

              ADR  R0,ARMProg

              BX    R0                  ;跳转到ARMProg,并且切换到ARM状态

            CODE32

ARMProg

            MOV  R4,#4

            MOV  R5,#5

            ADD  R4,R4,R5

stop

            MOV  R0,#0X18

            LDR   R1,=0X20026

            SWI   0X123456

            END

//C程序调用汇编程序

#include <stdio.h>

extern  void  strcopy(char *d,const char  *s) ;      //使用关键字extern声明外部函数,即调用的汇编程序

int main(void)

{

     const  char *srcstr="Source string";

     char  dststr[]="Destination string";

     printf("Before copying :/n");

     printf("%s/n  %s/n",srcstr,dststr);

     strcopy(dststr,srcstr);    

     printf("After copying :/n");

     printf("%s/n  %s/n",srcstr,dststr);

     return 0;

}

;汇编程序

          AREA  STRCOPY  ,CODE,READONLY

          EXPORT  strcopy    //使用EXPORT伪操作声明汇编程序

strcopy

          LDRB  R2,[R1],#1   //寄存器R1中存放第srcstr地址

          STRB  R2,[R0],#1

          CMP  R2,#0

          BNE  strcopy

          MOV PC,LR

          END

;汇编程序调用C程序

int sum(int a,int b,int c,int d, int e)

{

     return  a+b+c+d+e;

}

         EXPORT  CALLSUM

        AREA  F ,CODE ,READONLY

        IMPORT  sum                             ;使用IMPORT 声明C程序sum()

CALLSUM

        STR   LR,SP!           ;保存返回地址

        ADD   R1, R0,R0           ;假设进入程序时R0=I,设R1=2I

        ADD   R2,R1,R0

        ADD   R3,R1,R2

        STR   R3,[SP,#-4] !         ;第五个参数通过数据栈传递

        ADD   R3,R1,R1

        BL    sum

        ADD  SP,SP,#4                ;调整数据栈指针,准备返回

        LDR  PC,[SP],#4              ;返回

        END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM体系结构编程PDF是一本关于ARM架构和编程的电子书,它主要介绍了ARM处理器的体系结构和相关的编程知识。 首先,ARM体系结构编程PDF详细介绍了ARM架构的基本概念和特点。ARM架构是一种常见的嵌入式处理器架构,广泛应用于移动设备、嵌入式系统、智能家居等领域。了解ARM架构的基本概念对于学习和理解如何正确地编写ARM程序至关重要。 其次,ARM体系结构编程PDF讲解了ARM指令集的设计和特点。ARM指令集是用于编写ARM程序的一组指令,它包括了各种数据处理、控制流和存储操作等功能。学习ARM指令集的使用方法和特点,能够帮助我们编写高效、稳定的ARM程序。 此外,ARM体系结构编程PDF还介绍了ARM开发工具的使用。ARM开发工具是用于编写、编译和调试ARM程序的软件,例如ARM指令集模拟器、ARM汇编器和调试器等。学会使用ARM开发工具能够提高我们的ARM编程效率和调试能力。 最后,ARM体系结构编程PDF提供了一些ARM编程的示例和实践。通过这些实例和实践,我们可以深入了解如何在ARM处理器上编写各种应用程序,例如嵌入式系统的驱动程序、图像处理算法和网络通信等。这些实例和实践能够帮助我们加深对ARM编程的理解和掌握。 总的来说,ARM体系结构编程PDF是一本系统全面介绍ARM架构和编程的电子书。通过学习和掌握其中的知识,我们可以成为一名专业的ARM程序员,并能够在各种嵌入式系统和应用中灵活运用ARM处理器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值