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

ARM汇编:如何实现数组创建、元素加10及打印?附指令疑问

ARM汇编实现数组元素加10并打印(适配Harris-Harris课本示例)

先解决你关于数组声明指令的疑问

在GNU ARM汇编中,创建数组常用以下伪指令,课本未讲解可能是侧重核心指令而非汇编器伪指令:

  • .word:用于定义已初始化的32位字数组,每个后续数值会被存入连续的4字节内存。比如.word 1,2,3,4,5直接创建一个含5个元素的数组,每个元素有初始值。
  • .skip:用于预留未初始化的内存空间,参数为字节数。例如.skip 20(5×4字节)会预留出能存放5个32位元素的内存,但不会设置初始值,适合需要动态赋值的场景。

完整程序实现(GNU ARM汇编语法)

.data
    @ 声明并初始化5元素数组
    arr:    .word   1, 3, 5, 7, 9   @ 可自行修改初始值
    arr_len = . - arr                @ 计算数组总字节数(5×4=20)
    num_elem = arr_len / 4           @ 元素个数:5
    add_val = 10                     @ 要加的数值
    @ 打印格式字符串
    fmt:    .asciz  "%d "            @ 十进制打印格式(带空格分隔)
    new_line: .asciz "\n"

.text
.global main
.extern printf

main:
    @ 初始化寄存器:处理数组元素加10
    ldr     r0, =arr                 @ r0 = 数组起始地址
    mov     r1, #num_elem            @ r1 = 循环计数器(元素个数)
    mov     r2, #add_val             @ r2 = 要加的数值10

loop_add:
    ldr     r3, [r0]                 @ 加载当前数组元素到r3
    add     r3, r3, r2               @ r3 += 10
    str     r3, [r0]                 @ 将结果存回数组
    add     r0, r0, #4               @ 数组地址偏移4字节(下一个元素)
    subs    r1, r1, #1               @ 计数器减1,更新标志位
    bne     loop_add                 @ 计数器不为0则继续循环

    @ 打印数组所有元素
    ldr     r0, =arr                 @ 重置数组地址到起始位置
    mov     r1, #num_elem            @ 重置计数器

loop_print:
    ldr     r2, [r0]                 @ 加载当前元素到r2
    ldr     r0, =fmt                 @ r0 = 格式字符串地址
    bl      printf                   @ 调用printf打印元素
    @ 重置数组地址并偏移到下一个元素
    mov     r0, #0
    ldr     r0, =arr
    add     r0, r0, #4
    subs    r1, r1, #1               @ 计数器减1
    bne     loop_print               @ 未打印完则继续

    @ 打印换行
    ldr     r0, =new_line
    bl      printf

    @ 程序退出(Linux系统调用)
    mov     r7, #1
    mov     r0, #0
    swi     0

程序说明

  1. 数据段:用.word直接初始化数组,通过汇编器内置符号.计算数组长度,避免硬编码元素个数。
  2. 加10循环:用寄存器遍历数组,每次加载元素、执行加法、存回结果,直到所有元素处理完成。
  3. 打印逻辑:调用C标准库的printf函数打印每个元素,最后打印换行符。如果是课本中的裸机/模拟器环境,可将打印部分替换为对应平台的串口输出指令(比如向串口数据寄存器写入字符)。
  4. 编译运行:若使用GNU工具链,可通过以下命令编译运行(假设文件名为array_add.s):
    arm-linux-gnueabi-gcc array_add.s -o array_add
    qemu-arm array_add
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:20:33