汇编(三) -- 栈(sp\fp寄存器)
发布网友
发布时间:2023-05-04 16:25
我来回答
共1个回答
热心网友
时间:2023-11-02 08:57
最近准备学习汇编,然后在B站上看到叫iOS小贤的作者发的视频挺不错,打算跟着学,文章是看视频的笔记,最后有原视频链接,想看视频的可以看看通过链接查看视频。
注:用户主动请求而划分出来的内存区域,叫做 Heap(堆)。它由起始地址开始,从低位(地址)向高位(地址)增长。Heap 的一个重要特点就是不会自动消失,必须手动释放,或者由垃圾回收机制来回收。所谓的堆栈溢出是指堆栈开辟的空间碰到了一起,重叠,说明空间不够了。
注:以前push和pop操作的时候需要对寄存器做保护,也就是sp。做压栈的操作sp会挪动,之后需要恢复的时候sp是需要保护的,通过fp保护。现在push和pop取消了fp就显得比较鸡肋,但是要兼容32位,这个寄存器还保留着。
str(store register)指令
将数据从寄存器中读出来,存到内存中。
ldr(load register)指令
将数据从内存中读出来,存到寄存器中
此ldr 和 str 的变种ldp(pair) 和 stp(pair) 还可以操作2个寄存器。
使用32个字节空间作为这段程序的栈空间,然后利用栈将x0和x1的值进行交换。
注:sub是减, sub sp, sp, #0x20 是将ap向底地址挪动32个字节,然后赋值给sp。str是将寄存器里面的值放到内存中,但是str只能操作一个寄存器,stp可以操作两个, stp x0, x1, [sp, #0x10] 是将x0和x1放在 [sp, #0x10] , [sp, #0x10] 是一块内存区域,左边操作数加上右边操作数, [sp, #-0x10] 就是左边操作数减去右边操作数。
我们来写一下
我们来看一下内存地址,输入 0x000000016d57b8e0 ,看到内存开辟了16个字节的空间,当前sp是在6129432800处,前面讲到,写内存是往高地址写,所以 stp x0, x1, [sp, #0x10] 是往高地址写。
现在我们往x0和x1中写入0xffffffff,再ni。
因为 stp x0, x1, [sp, #0x10] 所以是从sp加16个字节出开始存数据。
注:add sp, sp, #0x20 是为了栈平衡,如果不这么做,栈会一直往低地址走,最终内存不够用,但是当函数调用完局部变量是不需要了,所以要回收栈空间。
栈(sp\fp寄存器)
汇编(四)
汇编(三) -- 栈(sp\fp寄存器)
因为 stp x0, x1, [sp, #0x10] 所以是从sp加16个字节出开始存数据。注: add sp, sp, #0x20 是为了栈平衡,如果不这么做,栈会一直往低地址走,最终内存不够用,但是当函数调用完局部变量是不需要了,所以要回收栈空间。栈(sp\fp寄存器) 汇编(四)
STM32F103C8T6的基本参数有哪些?
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具有以下基本参数:1. 工作频率:72MHz2. 外部时钟:最高可达120MHz3. 存储器容量:64K bytes4. 数据总线宽度:32位5. 输入/输出端口: - 串行数字输入:7位数字端口 - 并行数字输入:5位数字端口 - 串行数字输出:2位数字端口 - 并行数字输出:2位数字端口 - 模拟输入:0位模拟端口(AIN1 C,TA1 PD6) - 模拟输出:4位模拟端口(AIN0 ADC1, AIN1 ADC2, AIN1 ADC3, AIN1 ADC4)6. 定时器: - 看门狗定时器:1个 - 任务定时器:4个 - 延迟定时器:2个7. ADC: - 12-bit ADC with PWM …透过STM32您的嵌入式应用将得益于意法半导体优秀的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM Cortex-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微...
什么叫缓冲区溢出
当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容,做为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。下面举个例子:example1.c:--- void ...
理解函数调用栈
本文主要探讨了函数调用栈在arm汇编中的工作原理,涉及到关键寄存器如fp(x29), sp, 和lr(x30)的角色。fp指向当前函数调用栈的栈底,sp指向栈顶,而lr则保存了函数返回后下一条指令的地址。函数调用通过bl指令实现,调用前需确保lr值在内存中保存,以防后续调用修改其值。例如,函数a调用b和b调用c时...
C语言调用汇编程序时,使用哪些寄存器来传递参数?
\r\n寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。\r\n寄存器r15称为程序计数器,记作PC。\r\n2)堆栈的使用规则\r\nATPCS规定堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低...
什么是堆栈?堆栈指针的SP的作用是什么?8051单片机堆栈容量不超过多少...
一个名为堆栈指针(SP)的寄存器指向堆栈的顶部。 堆栈的底部在一个固定的地址。 堆栈的大小在运行时由内核动态地调整。 CPU实现指令 PUSH和POP, 向堆栈中添加元素和从中移去元素。 堆栈由逻辑堆栈帧组成。 当调用函数时逻辑堆栈帧被压入栈中, 当函数返回时逻辑 堆栈帧被从栈中弹出。 堆栈帧包括函数...
推栈方法概览
1. 读取SP寄存器值获取栈顶。2. 获取caller栈顶地址,推断r0寄存器中的callee返回地址。3. 上查找开栈操作,定位上一层栈帧。重复步骤完成栈帧回溯。X86架构的推栈步骤为:1. 通过sp、fp寄存器获取callee的栈帧范围,进而推断caller的栈帧。2. fp+8内存单元保存callee返回到caller的指令地址。重复步骤...
gdb机器语言工具
在gdb中,有四个标准寄存器名称被用来检查和修改计算机的通用寄存器,它们分别是:程序计数器($pc)、帧指针($fp)、栈指针($sp)和处理器状态($ps)。这些寄存器在不同计算机体系结构中的具体名称可能会有所不同,但在gdb中使用时,这些名称提供了一种统一的接口,便于程序开发者进行调试。程序计数...
堆栈溢出堆栈区域
理论上,局部变量可以通过SP加上偏移量来引用,但栈操作可能导致偏移量变化,这可能导致编译器需要额外开销或多条指令。因此,许多编译器会使用FP来稳定地访问局部变量和函数参数,如Intel CPU中的BP(EBP)和Motorola CPU中的除SP外的地址寄存器。在函数调用时,首先保存前一个FP,然后将SP复制到FP以创建...
Mips的帧指针寄存器$fp是干什么用的,怎么用的?
与sp指针配合,构成栈帧,调试回溯时需要。类似于x86中的bp.可参考 http://lambda.uta.edu/cse5317/notes/node34.html
"栈"和"栈帧"这两个概念到底如何区分
栈帧的两个边界分别有FP(R11)和SP(R13)L来限定。栈帧 栈的作用:1)保存局部变量 分析代码:[html] view plain copy include <stdio.h> int main(){ int a;a++;return a;} 反汇编之后的代码;[html] view plain copy stack: file format elf32-littlearm Disassembly of section .text:...