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

