在ARM汇编中将堆栈指针从4字节对齐为8字节 [英] Aligning a Stack pointer 8 byte from 4 byte in ARM assembly

查看:691
本文介绍了在ARM汇编中将堆栈指针从4字节对齐为8字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何将堆栈指针对齐8个字节,现在在ARM中是4字节对齐.根据我的理解,如果堆栈指针指向0x4,0x8、0x12和0x16之类的地址,则是4字节对齐. /p>

因此,将堆栈指针指向8个字节意味着它应该指向0x8,0x16,0x24和0x32之类的地址,依此类推.

现在如何将4字节堆栈指针与8字节对齐指针对齐?

解决方案

不要尝试自己手动对齐sp,而是要另外push个寄存器进行对齐.例如代替

push {r3, r4, lr}

在列表中再添加一个寄存器,即可轻松地与8对齐.

push {r1, r3, r4, lr}

这可能感觉像是额外的内存访问,但是通常而言,缓存可以使用比本机字长更宽的位向量.

还有一个注意事项,如果您不进行外部调用或接听电话,则无需强迫自己正确地进行堆栈对齐.因此,如果您有一个封闭的盒装装配例程,该例程不会调用外部世界或接收到一些外部例程,那么只要它不咬您自己的负载,您就可以忍受破碎的堆栈对齐方式.

How do I align a stack pointer to 8 byte which is now 4 byte aligned in ARM .As per my understanding stack pointer is 4 byte aligned if it points to some address like 0x4 ,0x8,0x12 and 0x16 so on.

So ,aliging a stack pointer to 8 byte means it should point to addresses like 0x8 ,0x16 ,0x24 and 0x32 and so on.

Now how Do I aligned 4 byte stack pointer to 8 byte aligned pointer?

解决方案

Don't try to align sp manually yourself, instead push one more register to get alignment. For example instead of

push {r3, r4, lr}

add one more register to the list to get alignment to 8 easily.

push {r1, r3, r4, lr}

This may feel like extra memory access but in general caches works with wider bit vectors than native word sizes.

Another note is also, you don't need to force yourself to get stack alignment right if you are not doing external calls or receiving. So if you have closed box assembly routine which doesn't make calls to external world or receive some, you can live with broken stack alignment as long as it doesn't bite your own loadings.

这篇关于在ARM汇编中将堆栈指针从4字节对齐为8字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆