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

ARM汇编中如何判断fgets()返回的NULL指针

问题解答

首先明确判断规则:
根据ARM架构的AAPCS调用约定,C标准库函数的返回值默认存储在R0寄存器中,你不需要判断buffer的内容,直接检查fgets调用后的R0值即可:

  • 读取成功时,R0会返回传入的buffer地址(非0值)
  • 遇到EOF或者读取错误时,R0返回NULL也就是数值0

你的现有代码存在逻辑顺序错误:你在调用fgets之后先调用了printf,printf的返回值会覆盖R0中存储的fgets返回结果,此时的cmp r0,#0判断的是printf的返回值,不是fgets的结果,逻辑是错误的。

修正后的代码如下:

read_file:
    mov r2, r5       // 文件指针存储在R5中
    ldr r0, =buffer
    mov r1, #254
    bl fgets
    // 先判断fgets返回值,再调用printf
    cmp r0, #0
    beq exit_program // 返回NULL时直接跳转退出
    bl printf
    b read_file
exit_program:
    bl exit

补充说明:

  • fgets返回NULL时,buffer中的内容是未定义的,不需要额外检查buffer内容判断退出条件
  • 所有符合AAPCS规范、返回值长度不超过4字节的C函数,返回值都会存在R0中,不需要读取其他寄存器做判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:54:04