Cortex-M系列:非中断、特权模式下的汇编语言

本文深入解析STM32H743微控制器在非中断模式下,如何通过Keil5环境利用汇编语言与C语言进行交互,重点讲解函数调用过程、堆栈管理及业务逻辑实现。通过具体实例,揭示了函数入栈、出栈机制,以及参数传递方式,对理解嵌入式系统底层操作具有重要意义。

通过Keil5,在stm32H743非中断模式下,使用主堆栈指针下的汇编语句查看。理解这个汇编逻辑后,将有利于更自由的进行程序调试,查找BUG。

文章涉及的汇编指令可以在工程中左侧:book→Device Data Books→Cortex-M7 Generic User Guide中查找。

目录

 


1 查看堆栈

通过调试模式下的Memory窗口,可以看到:

1、单片机是小端模式,

2、入栈是从后往前压,显然出栈应该是从前往后出。

3、栈是向下增长的。

4、从地址上还能看出,栈是存储在RAM中的

 

函数运行流程与汇编语言

2.1 没有输入参数而有输出参数的函数调用

这是C语言:

HAL_StatusTypeDef HAL_Init(void)
{
  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
  {
    return HAL_ERROR;
  }

  /* Init the low level hardware */
  HAL_MspInit();

  /* Return function status */
  return HAL_OK;
}

这是C语言对应的汇编:

首先,调用者通过跳转指令修改了PC、LR寄存器。

然后,被调用者内如果会调用其他函数,则会把LR寄存器压入栈中,如果有相关运算还需要使用寄存器,则也把这些寄存器压到栈中。程序运行结束时,把通用寄存器推出,并把有LR寄存器压入栈的值推导PC寄存器中。

状态

C语言

(箭头表示程序中断的位置)

黑色汇编,蓝色为说明

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值