汇编嵌套数组寻址及二维数组维度M、N取值推导疑问
汇编语言嵌套数组目标索引寻址问题分析
基础寻址规则
对于二维数组A,访问元素A[i][j]的内存地址计算公式为:A + i * (C * K) + j * K
参数说明:
- C:二维数组单一行包含的元素个数(即数组列数)
- K:数组单个元素占用的字节数
寻址示例
以访问int类型二维数组A[5][5]中的A[3][4]元素为例,已知int类型占4字节,代入公式可得目标地址计算式为A + 3*(4*5) + 4*4:
- 先偏移48字节跳过前3行共12个元素,到达目标行的起始地址
- 再偏移16字节跳过该行前4个元素,即可定位到目标列的元素
待解例题
课堂给出如下C语言代码,要求推导宏M、N的取值:
#define M ?? #define N ?? long P[M][N]; long Q[N][M]; long sum_elem(long i, long j) { return P[i][j] + Q[j][i]; }
对应的x86-64汇编实现如下,遵循调用约定:参数i存于%rdi寄存器,j存于%rsi寄存器:
# long sum_elem(long i, long j) # i in %rdi, j in %rsi sum_element: leaq 0(,%rdi,8), %rdx # 计算8*i存入%rdx subq %rdi, %rdx # 8*i - i = 7*i addq %rsi, %rdx # 7*i + j leaq (%rsi,%rsi,4), %rax # 4*j + j = 5*j addq %rax, %rdi # 5*j + i movq Q(,%rdi,8), %rax # 读取地址Q + 8*(5*j + i)处的值 add P(,%rdx,8), %rax # 读取地址P + 8*(7*i + j)处的值,与%rax累加 ret
疑问点
官方给出的答案为M=5、N=7,但按照基础寻址规则分析:
- P数组访问
P[i][j]的地址计算式为P + 8*(7*i +j),其中8是long类型的字节长度K,i的系数7对应该数组单行列数C,P的定义为long P[M][N],列数为N,因此N应为7 - Q数组访问
Q[j][i]的地址计算式为Q +8*(5*j +i),同理j的系数5对应该数组单行列数C,Q的定义为long Q[N][M],列数为M,因此M应为5
推导结果与官方答案的M、N顺序完全相反,需确认该差异是官方答案存在笔误,还是自身对寻址逻辑的理解存在遗漏。
注:发帖时原文存在书写笔误,已根据后续回答修正。
内容的提问来源于stack exchange,提问作者chadsqlcoder
相关产品推荐
相关产品推荐

