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

树莓派4下ARM汇编代码调用scanf出现段错误问题求助

问题根因定位

你的代码存在两个核心错误直接触发段错误:

  • 没有在main函数入口保存LR寄存器:BL printf、BL scanf这类带链接的跳转指令会直接覆盖LR寄存器中存储的main函数返回地址,你末尾执行BX LR时无法正常返回给系统,直接触发访问异常。
  • 调用glibc的printf、scanf这类可变参数函数前,没有满足ARM 32位AAPCS约定的栈8字节对齐要求,这是树莓派32位汇编调用外部C函数的强制规则。

修复后的核心代码示例

.data
.balign 4
msg1: .asciz "Enter a positive integer number length (m): \n"

.balign 4
scanfPattern: .asciz "%d"

.balign 4
length1Read: .word 0

.text
.global main
.extern printf
.extern scanf

main:
  @ 入口保存LR,同时调整栈满足8字节对齐要求
  PUSH {LR}
  SUB SP, SP, #4

  LDR R0, msg1Add
  BL printf

  LDR R0, scanfAdd
  LDR R1, length1Add
  BL scanf

  @ 读取输入的数值到R0,原有逻辑保留
  LDR R0, length1Add
  LDR R0, [R0]

  @ 恢复栈和返回地址,正常退出
  ADD SP, SP, #4
  POP {PC}

msg1Add : .word msg1
scanfAdd : .word scanfPattern
length1Add : .word length1Read

补充说明

如果你的树莓派4运行的是64位系统,编译时采用aarch64架构参数,则需要对应调整寄存器命名和调用约定,上述修复方案适用于树莓派默认的32位armhf运行环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:08