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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:43:24