如何通过汇编代码确定二维数组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对应的就是(行索引 × 列数 + 列索引)的核心计算部分。
推导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。推导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
相关产品推荐
相关产品推荐

