ATPCS规定arm的数据栈的操作是8字节对齐,为啥不是4字节呢?4字节是正好32位,应该可以满足需求啊!

作者&投稿:法狄 (若有异议请与网页底部的电邮联系)
Monitor是4字节对齐,还是8字节对齐~

比如你现在的数据占用了一个字节,但是你得给它们分四个字节。如果你现在的数据占用了五个字节,那你得给它们分八个字节。

堆栈指针应该是CPU内核中的一个寄存器,它存储的是栈底(或栈顶)的下一个空闲存储单元的地址。最低两位永远是0说明堆栈指针增加或减小都是以4为最小单位的,也就是说指针最小移动4个字节的地址。所以说堆栈总是4字节对齐的。

在ARMv5TE中,批量传送指令LDRD/STRD要求数据栈是8字节对齐的,以提高数

据的传送速度.用ADS编译器产生的目标文件中,外部接口的数据栈都是8字节对齐的,

并且编译器将告诉连接器: 本目标文件中的数据栈是8字节对齐的. 而对于汇编程序

来说,如果目标文件中包含了外部调用,则必须满足以下条件: 外部接口的数据栈一定

是8位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之

间,数据栈的栈指针变化为偶数个字; 在汇编程序中使用PRESERVE8伪操作告诉连

接器,本汇编程序是8字节对齐的.

我查到的,看的不是很懂,如果你查到了麻烦短信我下,谢谢了。


衢江区15739758935: ATPCS规定arm的数据栈的操作是8字节对齐,为啥不是4字节呢?4字节是正好32位,应该可以满足需求啊! -
泷王大克: 在ARMv5TE中,批量传送指令LDRD/STRD要求数据栈是8字节对齐的,以提高数据的传送速度.用ADS编译器产生的目标文件中,外部接口的数据栈都是8字节对齐的,并且编译器将告诉连接器: 本目标文件中的数据栈是8字节对齐的. 而对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足以下条件: 外部接口的数据栈一定是8位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字; 在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的.我查到的,看的不是很懂,如果你查到了麻烦短信我下,谢谢了.

衢江区15739758935: 汇编语言是怎么调用c语言的程序的? -
泷王大克: 一、 参数传递的基本规则(ATPCS(ARM—Thumb Procedure Call Standard)) 1、 参数传递二、汇编程序、C程序相互调用举例 1、 C程序调用汇编程序 汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程...

衢江区15739758935: LDMFD和STMFD 是什么意思,那位大神帮解呀
泷王大克: 指令STMFD和LDMFD分析; 根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD, 通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算...

衢江区15739758935: arm子函数定义中的参数是怎样放入寄存器的?规则是怎样的?非常感谢!
泷王大克: 对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回,关于ATPCS的详细内容可以查看ADS1.2 ...

衢江区15739758935: 如何在C语言中调用汇编函数 -
泷王大克: 1、 参数传递 二、汇编程序、C程序相互调用举例1、 C程序调用汇编程序 汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程序调用时参数的正确传递.在汇编程序中使用EXPORT 伪操作声明本程序,使得本程序可以被别的程序调用.在C程序使用extern声明该汇编程序.下面是一个C程序调用汇编程序的例子.其中汇编程序strcopy实现字符串复制功能,C程序调用strcopy完成字符串复制的工作.

衢江区15739758935: 嵌入式stmfd 伪代码 -
泷王大克: 要弄懂这个问题你要知道一点:sp始终是指向栈的顶部的,而且对于大多数的设计来说都是把栈底设置在高地址,栈顶设置在低地址,即是说上面所说的首先要sp=sp-sp*9*4,这里理解了之后就好理解了,根据上面你说的那个来分析一下,现在...

衢江区15739758935: ARM 汇编与C程序的混合编程(怎样实现4个以上的参数的传递)!
泷王大克: ADD proc arg_C equ 0xC arg_8 equ 8 arg_4 equ 4 arg_0 equ 0 MOV R12, SP STMFD SP!, {R0-R3} ;四个参数 STMFD SP!, {R4-R10,R12,LR} SUB SP, SP, #0x10 LDR R0, [SP,#0x34+arg_0] LDR R1, [SP,#0x34+arg_4] LDR R2, [SP,#0x34+arg...

衢江区15739758935: 关于ARM中汇编与C程序的混合编程的参数传递问题! -
泷王大克: C语言与汇编语言混合编程应遵守的规则 ARM编程中使用的C语言是标准C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境与ARM的硬件紧密相关.在使用C语言时,要用到和汇编语言的混合编程.若...

衢江区15739758935: arm中使用mov pc,lr之后r0到r3的值怎么变化? -
泷王大克: 我认为这个问题的疑惑来自于如果r0~r3不恢复的话,那主程序中使用的r0~r3不就被改变了嘛.如果我们仔细研究ATPCS原则,会发现是r0~r3仅仅只用来传递参数的,别无他用,例如fun函数调用test(a, b, c, d)假设a b c d都是局部变量,那么根据ATPCS原则,在调用test前它们应该存储在r4~r11中,或者fun函数的栈帧上,不是存储在r0 ~ r3. 调用test时 [a, b, c, d] 会先赋值到 r0 ~ r3.传递完参数后r0~r3就完成了使命,因此退出子程序再恢复r0~r3也没什么意义.而对于有返回值的函数,还会借助于r0当做返回值来用.

衢江区15739758935: 关于ARM汇编,STM和LDM指令的疑问 -
泷王大克: 恩,是这样的意思,ARM中的LDM/STM指令主要用于现场保护,数据复制,参数传送等.在ARM中,ARM堆栈结构是从高向低压栈的,在初始的时候就像你理解的那样,sp是在高地址,然后按照高编号进行压栈操作.ldm有相关伪指令,你可以参考下:LDMFD SP!,{R0-R7,PC}^ 对于这条指令,网上的伪代码解释是:address = SP; for i = 0 to 7 Ri = Memory[address ,4] address = address + 4; SP = address;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网