Skip to main content

moregeek program

嵌入式:什么是atpcs-多极客编程

ATPCS介绍

ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。

寄存器的使用规则

子程序间通过寄存器R0~R3来传递参数,这时,寄存器R0~R3可以记作A1~A4。被调用的子程序在返回前无需恢复寄存器R0~R3的内容;

在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器 R4~R11可以记作V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量;

寄存器R12用作子程序间的scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip(Intra-Procedure-call Scratch Register;内部程序调用暂存寄存器)。在子程序间的连接代码段中常有这种使用规则;

寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等;

寄存器R14称为链接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途;

寄存器R15是程序计数器,记作pc。它不能用作其他用途。

ATPCS中各寄存器的使用规则及其名称

寄存器

别名

特殊名

使用规则

R0

a1


参数/结果/scratch寄存器1

R1

a2


参数/结果/scratch寄存器2

R2

a3


参数/结果/scratch寄存器3

R3

a4


参数/结果/scratch寄存器4

R4

v1


ARM状态局部变量寄存器1

R5

v2


ARM状态局部变量寄存器2

R6

v3


ARM状态局部变量寄存器3

R7

v4

wr

ARM状态局部变量寄存器4 Thumb状态工作寄存器

R8

v5


ARM状态局部变量寄存器5

R9

v6

sb

ARM状态局部变量寄存器6, 在支持RWPI的ATPCS中为静态基址寄存器

R10

v7

sl

ARM状态局部变量寄存器7, 在支持数据栈检查的ATPCS中为数据栈限制指针

R11

v8

fp

ARM状态局部变量寄存器8/帧指针

R12


ip

子程序内部调用的scratch寄存器

R13


sp

数据栈指针

R14


lr

连接寄存器

R15


pc

程序计数器

数据栈使用规则

满(FULL)栈

当堆栈指针指向栈顶元素,即指向最后一个入栈的数据元素时

空(EMPTY)栈

当堆栈指针指向与栈顶元素相邻的一个可用数据单元时

递减(DESCENDING)堆栈

当数据栈向内存地址减小的方向增长时

递增(ASCENDING)堆栈

当数据栈向内存地址增加的方向增长时,

  • FD (Full Descending) 满递减
  • ED (Empty Descending)空递减
  • FA (Full Ascending) 满递增
  • EA (Empty Ascending) 空递增

ATPCS规定数据栈为FD(满递减)类型。异常中断的处理程序可以使用中断程序的数据栈,但是要保证中断程序的数据栈足够大。

参数传递规则

参数个数固定的子程序参数传递规则

各个浮点参数按顺序处理;

为每个浮点参数分配FP寄存器。分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。

第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递

参数个数可变的子程序参数传递规则

对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数;

在参数传递时,将所有参数看作是存放在连续的内存字单元中的字数据。然后,依次将各字数据传送到寄存器R0、Rl、R2、R3中,如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。

子程序结果返回规则

结果为一个32位的整数时,可以通过寄存器R0返回;

结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推;

结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0来返回;

结果为复合型的浮点数(如复数)时,可以通过寄存器f0\fn或者d0\dn来返回。

对于位数更多的结果,需要通过内存来传递。

参考文献:

孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017.

嵌入式:arm内嵌汇编及c和arm汇编相互调用-多极客编程

内嵌汇编在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。内嵌汇编

嵌入式:杂项汇编器伪指令-多极客编程

AREA格 式:AREA 段名 属性1,属性2,……功 能:AREA伪操作用于定义一个代码段、数据段或特定属性的段。 其中,段名若以数值开头,则该段名需用“|”括起来,如|1_test|,用C的编译器产生的代码一般也用“|”括起来。属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。使用示例:AREA Init,CODE,READONLY ;定义段Init,代码段,只读

嵌入式:arm汇编语言程序设计基础教程-多极客编程

汇编语言程序设计的步骤① 合理地分配存储器资源,将前述的目标系统‘数据结构模型’表示到各存储器单元。② CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。用计算机语言,对数据结构模型和流程图表示的算法进行准确地描述。① 语法调试:排除程序中的语法错误。② 功能调试:保证程序的逻辑功能正确性。用文档

linux 下命令-多极客编程

linux 下命令      Linux 是一套免费使用和自 由传播的类 Unix 操作系统, 是一个基于 POSIX 和 UNIX 的多用户、 多任务、 支持多线程和多 CPU 的操作系统。 它能运行主要的 UNIX 工具软件、 应用程序和网络协议。 它支持 32 位和 64 位硬件。 Linux 继承了 Unix 以网络为核心的设计思想, 是一个性能稳定的多用户网络操作系统。        L

嵌入式:s3c2410与s3c2440的区别-多极客编程

S3C2410A微处理器概述SAMSUNG公司的S3C2410A芯片是一款16/32位的RISC微处理器芯片,芯片内使用了ARM公司的ARM920T内核,采用了称为AMBA(Advanced Microcontroller Bus Architecture,先进微处理器总线结构)的总线结构。S3C2410A芯片组成介绍如下:ARM920T,内部包含两个协处理器、单独16KB指令Cache和MMU、

优化温度检测工程架构的心得-多极客编程

一、硬件与架构设计本项目中用到的设备有:PC、FPGA、温度传感器DS18B20、蜂鸣器(beep)、数码管(segment)。对于本次的项目,我的任务是将之前的温度检测项目的架构再进行细分,以及将相应的代码写出来并且能够上板调试出来。之前的温度检测项目的架构主要分了九个模块:分别是uart_rx模块、ascii_hex模块、opcode模块、control模块、byte模块、bit模块、seg_

嵌入式:arm内嵌汇编及c和arm汇编相互调用-多极客编程

内嵌汇编在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。内嵌汇编

嵌入式:杂项汇编器伪指令-多极客编程

AREA格 式:AREA 段名 属性1,属性2,……功 能:AREA伪操作用于定义一个代码段、数据段或特定属性的段。 其中,段名若以数值开头,则该段名需用“|”括起来,如|1_test|,用C的编译器产生的代码一般也用“|”括起来。属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。使用示例:AREA Init,CODE,READONLY ;定义段Init,代码段,只读

嵌入式:arm汇编语言程序设计基础教程-多极客编程

汇编语言程序设计的步骤① 合理地分配存储器资源,将前述的目标系统‘数据结构模型’表示到各存储器单元。② CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。用计算机语言,对数据结构模型和流程图表示的算法进行准确地描述。① 语法调试:排除程序中的语法错误。② 功能调试:保证程序的逻辑功能正确性。用文档

嵌入式:s3c2410与s3c2440的区别-多极客编程

S3C2410A微处理器概述SAMSUNG公司的S3C2410A芯片是一款16/32位的RISC微处理器芯片,芯片内使用了ARM公司的ARM920T内核,采用了称为AMBA(Advanced Microcontroller Bus Architecture,先进微处理器总线结构)的总线结构。S3C2410A芯片组成介绍如下:ARM920T,内部包含两个协处理器、单独16KB指令Cache和MMU、

嵌入式:arm中断系统设计全解-多极客编程

一、ARM9的异常事件管理ARM920T能处理有8个异常,他们分别是:Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),Reserved,IRQ,FIQ ,它们的矢量表是:Address Instruct 0x00000000: b

嵌入式:arm的dma设计-多极客编程

一、DMA工作原理所谓DMA方式,即直接存储器存取(Direct Memory Acess),在DMA控制器的控制下,不通过CPU控制,高速地和I/O设备和存储器之间交换数据。S3C2410具有一个4通道DMA控制器。该DMA控制器位于系统总线(AHB)和外设总线(APB)之间。每个DMA通道均能在系统总线和(或)外设总线之间执行一次数据搬移。这样可以有四种DMA数据搬移:(1)源设备和目标都在