请选择 进入手机版 | 继续访问电脑版

risc-v中文社区

 找回密码
 立即注册
查看: 829|回复: 1

堆栈类型介绍

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-10-8 10:38:07 | 显示全部楼层 |阅读模式
堆栈类型有满递增,满递减,空递增,空递减等,有时候总是搞不清楚,我以arm中的堆栈来举例:
stmfd sp!,{fp,lr},其中,sp!在ARM汇编语法中表示基址寄存器为sp,!表示请求回写,即当数据传输完成后将最后的地址写入到基址寄存器sp中,不选 用则基址寄存器sp内容不改变。
LDM和STM还分为两种情况,一种是普通数据传送,还有一种是用于堆栈的操作时。
普通数据传输过程中使用 IA,IB,DA,DB区别基址的移动方向,A和B分别表示before和after,I和D分别表示Increment和Decrement(增加和减少),比如:
xxxIA 传送后地址增加4  xxx代表是LDM或STM 即LDMIA,STMIA
xxxDA 传送后地址减少4
xxxIB 传送前地址增加4
xxxDB 传送前地址减少4
用于堆栈时用FD,ED,FA,EA来区别栈操作的方式,F表示FULL(满栈)而E表示EMPTY(空栈),A表示Ascenging(递增),D表示Descending(递减):
xxxFD 满栈递减(ARM核通常都是这种模式)即STMFD或LDMFD
xxxFA 满栈递增
xxxED 空栈递减
xxxEA 空栈递增
那什么是满栈,什么是空栈类型呢?(https://blog.csdn.net/GRT609/article/details/124206662)
所谓满堆栈类型是指当堆栈指针指向最后压入堆栈的数据,而空栈类型是指数据入栈之后或出栈之后,堆栈指针指向下一个将要放入数据的空位置。
根据堆栈的生成方式,可以分为递增堆栈(Ascending Stack)和递减堆栈(Descending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈(Ascending Stack),当堆栈由高地址向低地址生成时,称为递减堆栈(Descending Stack)。
1)满递增(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成
2)满递减(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成
3)空递增(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成
4)空递减(ED):堆栈指针指向下一个将要放入数据的空位置,由高地址向低地址生成
FA:堆栈指针值为0x1000,压入32位数据时,0x1001/2/3/4共4个字节放入数据,堆栈指针最后指向0x1004;
FD:堆栈指针值为0x1000,压入32位数据时,0xffff/e/d/c共4个字节放入数据,堆栈指针指向0xfffc;
EA:初值也是0x1000,压入32位数据时(注意,此时0x1000其实是没有有效数据),0x1000/1/2/3中存入数据,但指针指向0x1004
ED:初值也是0x1000,压入之后,0x1000/0xffff/0xfffe/0xfffd中是数据,但指针指向0xfffc。
如果用代码来检测ARM堆栈的类型可参考https://blog.csdn.net/GRT609/article/details/124206662

stmfd sp!,{fp,lr} //push lr and fp,参考 https://www.cnblogs.com/w-smile/p/14019942.html
//stmfd指令中 st表示store存储,将一个值放入堆栈指针所指的栈中,m表示多次,
//fd表示满递减类型,即满递减类型堆栈
//!表示每次sp操作之后都要将新值写入sp,{fp,lr}是先压入lr,再压入fp,即从右到左
//伪动作:
//sp -= 4
//sp=lr
//sp -= 4
//sp=fp
//如果是stmed sp,{fp,lr} 入栈 多次 空递减类型 不回写sp
//伪动作:
//sp = lr
//sp - 4 = fp       
//如果是stmed sp!,{fp,lr}
//伪动作:
//sp = lr
//sp -= 4
//sp = fp
//sp -= 4



回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-10-8 10:44:07 | 显示全部楼层
ARM中不管是thumb还是ARM,APCS(ARM Procedure Call Standard,ARM 程序调用标准)用的都是FD类型堆栈。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-17 03:00 , Processed in 0.038113 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表