You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RISC-V汇编中.weak汇编指令的具体作用是什么?

RISC-V汇编中.weak指令的作用解析(针对CH32003V启动代码)

我正在学习RISC-V汇编语言,习惯通过阅读他人代码积累实践经验。在CH32003V(一款新型RISC-V微处理器)的启动代码中,我发现了.weak汇编指令,查阅相关资料后仍未找到其相关说明,以下是包含该指令的代码片段:

.section  .init, "ax", @progbits
    .globl  _start
    .align  2
_start:
    .option   norvc;
    j       handle_reset
    .word   0
    .word   NMI_Handler                  /* NMI Handler */
    .word   HardFault_Handler            /* Hard Fault Handler */
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   SysTick_Handler             /* SysTick Handler */
    .word   0
    .word   SW_Handler                  /* SW Handler */
    .word   0
    /* External Interrupts */
    .word   WWDG_IRQHandler             /* Window Watchdog */
    .word   PVD_IRQHandler              /* PVD through EXTI Line detect */
    .word   FLASH_IRQHandler            /* Flash */
    .word   RCC_IRQHandler              /* RCC */
    .word   EXTI7_0_IRQHandler          /* EXTI Line 7..0 */
    .word   AWU_IRQHandler              /* AWU */
    .word   DMA1_Channel1_IRQHandler    /* DMA1 Channel 1 */
    .word   DMA1_Channel2_IRQHandler    /* DMA1 Channel 2 */
    .word   DMA1_Channel3_IRQHandler    /* DMA1 Channel 3 */
    .word   DMA1_Channel4_IRQHandler    /* DMA1 Channel 4 */
    .word   DMA1_Channel5_IRQHandler    /* DMA1 Channel 5 */
    .word   DMA1_Channel6_IRQHandler    /* DMA1 Channel 6 */
    .word   DMA1_Channel7_IRQHandler    /* DMA1 Channel 7 */
    .word   ADC1_IRQHandler             /* ADC1 */
    .word   I2C1_EV_IRQHandler          /* I2C1 Event */
    .word   I2C1_ER_IRQHandler          /* I2C1 Error */
    .word   USART1_IRQHandler           /* USART1 */
    .word   SPI1_IRQHandler             /* SPI1 */
    .word   TIM1_BRK_IRQHandler         /* TIM1 Break */
    .word   TIM1_UP_IRQHandler          /* TIM1 Update */
    .word   TIM1_TRG_COM_IRQHandler     /* TIM1 Trigger and Commutation */
    .word   TIM1_CC_IRQHandler          /* TIM1 Capture Compare */
    .word   TIM2_IRQHandler             /* TIM2 */

    .option rvc;
    .section  .text.vector_handler, "ax", @progbits
    .weak   NMI_Handler
    .weak   HardFault_Handler
    .weak   SysTick_Handler
    .weak   SW_Handler
    .weak   WWDG_IRQHandler
    .weak   PVD_IRQHandler
    .weak   FLASH_IRQHandler 


    .weak   RCC_IRQHandler

.weak指令的核心作用

.weak是GNU汇编器(GAS)提供的伪指令,不属于RISC-V架构专属,在多架构汇编代码中都有应用,它的核心功能是定义弱符号:

  • 若程序中未实现该符号的强版本(即未通过.globl声明或直接编写同名函数),链接器会使用这个弱符号的默认实现(通常这类默认中断处理函数是空逻辑,比如仅包含返回指令或无限循环)。
  • 若用户自行实现了同名的强符号(比如自己编写了NMI_Handler函数),链接器会优先选用用户的实现,忽略启动代码中的弱定义。

在CH32003V的启动代码里,.weak用来标记所有默认中断处理函数,这样用户只需实现自己需要用到的中断逻辑,无需关注未使用的中断——当未实现的中断触发时,系统会执行默认的弱处理函数,避免因无对应处理逻辑导致崩溃。

内容的提问来源于stack exchange,提问作者user273824

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:05:22