HELLO_WORLD嵌入式实验汇编调试分析-vitis

嵌入式结构分析

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 寄存器的用途包括:

  1. 帧指针: 在函数调用时,r11 寄存器可以被用作帧指针,指向当前函数的栈帧的起始位置。栈帧是一个包含局部变量、参数和其他与函数执行相关的信息的区域。

  2. 局部变量访问: 通过使用帧指针,程序可以轻松地在函数内访问局部变量。相对于帧指针的偏移量可用于引用局部变量和函数参数。

  3. 维护函数调用链: 在一些情况下,帧指针也可以用来维护函数调用链,即链接到上一个函数的帧指针,以便在函数返回时可以正确地恢复调用栈

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语言阅读能力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值