树莓派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
相关产品推荐
相关产品推荐

