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

汇编嵌套数组寻址及二维数组维度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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:42:31