AT&T汇编中数组的声明与索引写法是否正确?求正确实现方式
AT&T汇编数组声明与索引操作详解
首先,你的数组声明是完全正确的!咱们先从这部分说起,再聊聊索引操作里需要调整的地方。
一、数组声明的正确方式
你用的 .zero 256 是AT&T汇编里初始化零值数组的标准写法,它会在内存中分配256个字节的空间,并且每个字节都初始化为0。如果需要声明不同类型或有初始值的数组,还有这些常用方式:
- 字节数组(每个元素1字节):
byte_array: .byte 0x01, 0x02, 0x03, 0x04 // 初始化4个字节元素 empty_byte_array: .space 100 // 分配100字节未初始化空间 - 四字数组(每个元素8字节,对应x86_64的
qword):quad_array: .quad 1, 2, 3, 4, 5 // 初始化5个8字节整数
你的 .zero 256 特别适合需要大片零值内存的场景,比如缓冲区,完全没问题。
二、数组索引操作的问题与修正
你的索引思路是对的,但最后一步存值的代码有错误,咱们拆解来看:
正确的读操作(从数组索引位置取值)
你这段读操作代码是对的:
movq $array, %r14 // 将数组的起始地址加载到r14(base寄存器) movq $5, %r11 // 假设r11存的是索引值5 movq (%r14, %r11, 8), %r15 // 读取array[5]到r15
这里的AT&T寻址模式 (base, index, scale) 逻辑是:内存地址 = base + index * scale,scale 是每个元素的字节数。因为你用的是movq(四字操作),所以scale设为8是正确的,对应每个数组元素占8字节。
需要修正的写操作(往数组索引位置存值)
你写的 movq %rbx, %r15 只是把rbx的值放到r15寄存器里,并没有写入数组内存。正确的写法应该是把内存地址作为目标操作数:
movq %rbx, (%r14, %r11, 8) // 将rbx的值写入array[5]的内存位置
完整的读写示例
把这些整合起来,完整的代码片段大概是这样:
.data array: .zero 256 // 256字节的零数组(可容纳32个四字元素) .text .globl _start _start: movq $array, %r14 // 加载数组基地址到r14 movq $5, %r11 // 设置索引为5 // 读操作:array[5] -> r15 movq (%r14, %r11, 8), %r15 // 修改r15的值,再写回数组 addq $10, %r15 movq %r15, (%r14, %r11, 8) // 退出程序(x86_64 Linux) movq $60, %rax xorq %rdi, %rdi syscall
总结
- 数组声明:你的
.zero 256完全正确,根据元素类型可以选择.byte/.quad等指令; - 索引操作:读操作没问题,写操作要把目标改成内存寻址模式
(%r14, %r11, 8)而不是寄存器。
内容的提问来源于stack exchange,提问作者Tribunal Homeland
相关产品推荐
相关产品推荐

