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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:49:59