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

如何通过汇编代码确定二维数组array1与array2的维度

从汇编代码推导二维数组维度

给定代码

C语言代码

int array1[H][J];
int array2[J][H];
void copy_array(int x, int y) {
    array2[y][x] = array1[x][y];
}

对应的汇编代码

copy_array:
movslq %edi,%rdi # rdi = x
movslq %esi,%rsi # rsi = y
movq %rsi, %rdx # rdx = y
salq $4, %rdx # rdx = 2^4y=16y
subq %rsi, %rdx # rdx = 16y – y = 15y
addq %rdi, %rdx # rdx = 15y+x
leaq 0(,%rdi,8), %rax # rax = 8x
subq %rdi, %rax # rax = 8x-x = 7x
addq %rsi, %rax # rax = 7x+y
movl array1(,%rax,4), %eax
movl %eax, array2(,%rdx,4) 
ret

推导过程

C语言中二维数组的内存地址计算规则是:数组基地址 + (行索引 × 列数 + 列索引) × 元素字节数。这里元素是int类型,占4字节,汇编中通过(,%reg,4)的形式实现乘以4的操作,因此%rax和%rdx对应的就是(行索引 × 列数 + 列索引)的核心计算部分。

  1. 推导array1的维度J
    array1的访问是array1[x][y],对应汇编中array1(,%rax,4),其中%rax =7x + y。
    根据地址规则,array1[x][y]的索引部分应为x × J + y,因此:

    x × J + y =7x + y
    

    消去y后可得J=7。

  2. 推导array2的维度H
    array2的访问是array2[y][x],对应汇编中array2(,%rdx,4),其中%rdx=15y +x。
    array2的类型是[J][H],因此array2[y][x]的索引部分应为y × H +x,因此:

    y × H +x =15y +x
    

    消去x后可得H=15。

最终结论

  • array1的维度是[15][7](H=15,J=7)
  • array2的维度是[7][15](J=7,H=15)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:20