Linux环境下ARM汇编:如何将用户输入存入寄存器并判断是否为-1
ARM汇编输入判断问题:错误修复与实现思路
错误原因分析
你遇到的immediate expression requires a # prefix错误,根源是ARM的MOV指令不能直接从内存加载数据。MOV只能用于寄存器之间传输,或者将带#前缀的立即数存入寄存器。要从内存地址读取数据到寄存器,必须使用LDR指令。另外,你的代码里[input]是格式字符串的地址,并非用户输入整数的存储位置——你已经通过scanf把输入存在num变量里,应该从num的地址加载值。
完整修正代码
先补充你缺失的.data段(定义字符串和存储变量),再修复指令错误并实现循环逻辑:
.data prompt: .asciz "请输入一个整数(输入-1结束):" input: .asciz "%d" num: .word 0 @ 存储用户输入的整数 .text .global main main: # 保存返回地址到栈 SUB sp, sp, #4 STR lr, [sp, #0] loop_start: # 提示用户输入 LDR r0, =prompt BL printf # 读取用户输入到num变量 LDR r0, =input LDR r1, =num BL scanf # 将num中的值加载到r0 LDR r0, =num LDR r0, [r0] @ 从num的内存地址读取值到r0 # 判断是否为-1 MOV r1, #-1 CMP r0, r1 BEQ exit_program @ 如果等于-1,跳转到退出逻辑 # 不是-1,继续循环 B loop_start exit_program: # 返回OS LDR lr, [sp, #0] ADD sp, sp, #4 MOV pc, lr
关键修正点说明
- 数据段补充:必须定义
prompt(提示文本)、input(scanf的格式控制串)、num(存储输入整数的内存单元),否则汇编器会找不到这些符号。 - 内存数据加载:用
LDR r0, =num获取num的地址,再用LDR r0, [r0]从该地址读取实际整数值到r0,这是ARM汇编读取内存变量的标准方式。 - 循环逻辑实现:通过
loop_start标签和B loop_start实现循环,用BEQ exit_program在输入为-1时跳出循环。 - 指令替换:彻底移除错误的
MOV r0, [input],改用正确的LDR指令完成内存到寄存器的数据传输。
内容的提问来源于stack exchange,提问作者Priscilla A
相关产品推荐
相关产品推荐

