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

