嵌入式结构分析
c语言源代码
汇编主函数代码:
汇编代码分析:
00100584: push {r11,lr}
将寄存器r11和链接寄存器(Link Register)lr的值压入堆栈
【lr寄存器】是 ARM 架构中的链接寄存器(Link Register),也称为返回地址寄存器。这个寄存器通常用于保存函数调用的返回地址,即指向调用该函数的指令的地址。
当函数被调用时,调用指令会将下一条指令的地址存储到 lr 寄存器中。然后,在函数执行过程中,如果存在函数调用其他函数,当前函数会将 lr 寄存器的值压入堆栈,以便在后续的 bx lr 或 pop {lr} 等指令中用于返回到调用点。
【r11
寄存器】通常被用作局部变量的基址寄存器,也被称为帧指针寄存器(Frame Pointer Register)。在一些编程模型中,r11
寄存器被用来指向当前函数的栈帧(stack frame),帮助在函数中访问局部变量和参数。
具体来说,r11
寄存器的用途包括:
-
帧指针: 在函数调用时,
r11
寄存器可以被用作帧指针,指向当前函数的栈帧的起始位置。栈帧是一个包含局部变量、参数和其他与函数执行相关的信息的区域。 -
局部变量访问: 通过使用帧指针,程序可以轻松地在函数内访问局部变量。相对于帧指针的偏移量可用于引用局部变量和函数参数。
-
维护函数调用链: 在一些情况下,帧指针也可以用来维护函数调用链,即链接到上一个函数的帧指针,以便在函数返回时可以正确地恢复调用栈。
00100588: add r11, sp, #4
sp+4写到r11
0010058c: bl +108 ; addr=0x00100600: init_platform
【bl】
是分支指令(Branch with Link),用于跳转到一个目标地址并将返回地址保存在链接寄存器(LR)中。
此处程序跳转到init_platform(初始化函数)包含使能cache和初始化uart
函数嵌套先pushr11和lr
再将sp+4即堆栈顶地址保存到r11
【nop
】是汇编语言中的一个指令,代表 "no operation"(无操作)。这个指令通常用于在程序中插入一个空操作,不执行任何有意义的操作。
最后返回r11和pc
00100590: movw r0, #2612
00100594: movt r0, #16
【movw】表示将立即数写入一个寄存器的低 16 位
【movt】表示将立即数的高 16 位写入一个寄存器的高 16 位
将要打印的第一个char数组(ascii码)存入r0
00100598: bl +140 ; addr=0x0010062c: print
进入print函数遍历char并打印
0010059c: movw r0, #2628
001005a0: movt r0, #16
将要打印的第二个char数组(ascii码)存入r0
001005a4: bl +128 ; addr=0x0010062c: print
进入print函数遍历char并打印
001005a8: bl +104 ; addr=0x00100618: cleanup_platform
清除硬件平台
001005ac: mov r3, #0
001005b0: mov r0, r3
001005b4: pop {r11,pc}
return 0
调试窗口:
算是用hello world为程序调试练手,也是锻炼c语言阅读能力