havenow 发表于 2021-3-21 20:36

如何动态调试来学习ARM汇编 6 fp(r11)寄存器

本帖最后由 havenow 于 2021-3-21 20:43 编辑

R11 FP 栈帧寄存器
函数利用栈来保存局部变量,保存寄存器状态;为了让所有事物有序运行,函数使用栈帧,即栈中的一片本地化内存区域,专用于特定的函数;栈帧是在函数的prologue中创建的。将栈帧指针(FP)设置到栈帧的底部,然后为栈帧分配的栈缓存会被开辟。

栈帧(从它的底部开始)通常包含返回地址(LR)、先前的帧指针、需要保存的任何寄存器、函数参数(如果函数接受超过4个参数)、局部变量等。
虽然栈帧的实际存储内容可能有所不同,但是之前概述的那些内容是最常见的。最后,栈帧在函数运行到结尾部分时被破坏。
下图是栈中栈帧的抽象简图



下面的函数
int main(){
int res = 0;
int a = 1;
int b = 2;
res = max(a, b);
return res;
}

int max(int a,int b){
do_nothing();
if(a<b) {
return b;
} else {
return a;
}
}

int do_nothing(){
return 0;
}
进入max函数执行完第一条指令0xaae2441c <+0>:      push      {r11, lr} 后

注意这里栈中地址0xfffefac8存的是上一次的fp寄存器的值,max函数的mov r11, sp执行后
───────────────────────────────────────────────────────────────────────────────────── stack ────
0xfffefab0│+0x0000: 0xfffefac8→0xfffefaf8→0x00000000       ← $r11, $sp
0xfffefab4│+0x0004: 0xaae2440c→<main+52> str r0,
0xfffefab8│+0x0008: 0x00000002
0xfffefabc│+0x000c: 0x00000001
0xfffefac0│+0x0010: 0x00000000
0xfffefac4│+0x0014: 0x00000000
0xfffefac8│+0x0018: 0xfffefaf8→0x00000000
0xfffefacc│+0x001c: 0xf7691c4f→<__libc_init+51> blx 0xf768f514 <exit@plt>

jfkkf123 发表于 2021-3-21 22:17

请问一般在什么情况下才会自己来写汇编程序?裸机开发?还是其他什么情况下

bigdawn 发表于 2021-3-21 23:00

汇编不容易啊

ice_xyz 发表于 2021-3-22 16:06

学到了,谢谢!

鹤舞九月天 发表于 2021-3-23 07:43

Z最好能讲讲具体的指令

来根烟 发表于 2021-3-23 12:09

感谢分享1111

lovehfs 发表于 2021-3-23 19:41

最近在学汇编,好好了解一下。

havenow 发表于 2021-4-6 09:42

jfkkf123 发表于 2021-3-21 22:17
请问一般在什么情况下才会自己来写汇编程序?裸机开发?还是其他什么情况下

个人所知,写bootloader或者app加壳

芽衣 发表于 2021-5-7 10:03

这个是搬运的吧,百度也有一模一样的。{:301_998:}
页: [1]
查看完整版本: 如何动态调试来学习ARM汇编 6 fp(r11)寄存器