assembly 组件中的巢状数组,达到所需的索引

qjp7pelc  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(113)

这是关于用汇编语言在嵌套数组中达到所需的索引。让我开始吧。

  • 首先,我知道对于一个给定的数组“A”,你可以通过下式到达A[i][j];*A + i (C * K)+ j * K 假定C是数组中的元素编号。K是A中元素类型所需的字节。

所以这是有意义的。例如,你想到达int A[3][4] in A[5][5],你必须通过A中的3个数组。每个数组由4个元素组成,每个元素花费4个字节。因此;A + 3(4 * 5)+ 4 * 4。首先,你要遍历12个元素,在地址上遍历48个字节。然后,你在所需行的开头。然后,你跳过4个元素(16个字节)和所需列,换句话说,该行的第5个元素。
但是,我们在课堂上有一个例子,我完全不明白是怎么回事。我不能邮件老师,因为我知道这不会有任何结果。所以请帮助我理解这一点。
第一个
正如您所猜测的,我们需要回答M和N值。然而,如果我们调查上述之一,即[P + 8*],则M = 5,N = 7。(7*i + j)],那么8代表我们最开始定义中的K值。7代表C,它是A中数组所包含的元素数。因此,我认为应该是M = 7,N = 5,这与答案相反。
我是正确的,这只是一个错字或我错过了什么?
谢谢大家。
编辑:我有一个错字,而写作,感谢答案,它是纠正。

enxuqcxy

enxuqcxy1#

例如,你想到达A[5][5]中的int A[3][4],你必须通过A中的3个数组。每个数组包含4个元素,每个元素占用4个字节。
不完全是。每个元素都由5个元素组成,因为它被声明为A[5][5]。
3和4是索引,5和5是大小。当计算偏移量时,你需要将外部数组中的 index 乘以内部数组的 size。这样做有意义吗?
编辑:公式A + 3 ( 4 * 4 ) + 4 * 4是错误的。应该是A + 3 ( 5 * 4 ) + 4 * 4,因为内部数组的大小是5。这样得到的是A+76
对于5x 5阵列,内存为:

0: A[0][0] <-the 0th subarray starts at A
 4: A[0][1]
 8: A[0][2]
12: A[0][3]
16: A[0][4]
20: A[1][0] <-the 1st subarray starts - note the 5 elements before it
24: A[1][1]
28: A[1][2]
32: A[1][3]
36: A[1][4]
40: A[2][0] <-the 2nd subarray starts
44: A[2][1]
48: A[2][2]
52: A[2][3]
56: A[2][4]
60: A[3][0] <-the 3rd subarray starts - the offset 3(5*4) points here
64: A[3][1]
68: A[3][2]
72: A[3][3]
76: A[3][4] <-------- This is what you want
80: A[4][0]
84: A[4][1]
88: A[4][2]
92: A[4][3]
96: A[4][4]

所以为了得到元素[3,4],你必须跳过3complete子数组,每个子数组的大小为5*4字节,然后跳过第4个子数组中的4个元素。
编辑:关于一个4字节值的5x 5数组的玩具例子,现在来看看具体的问题。注意,它是一个8字节长的数组。因此,计算元素[i][j]在数组[A][B]中的偏移量的公式被重写为:

array_base + A*i*8 + j*8

可以重写为

array_base + 8*(A*i + j)

因此,通过计算出索引发生了什么,可以恢复数组的 * 第一 * 维。
现在,关于程序集片段。公式计算正确:到Q元素的偏移量是8*(5*j + i),到P元素的偏移量是8*(7*i + j)。我们注意到[A][B]数组元素偏移量的一般公式根本不涉及B的值。另外,我们注意到P声明为P[M][N],Q声明为Q[N][M]--维度颠倒了。因此,P的第一维是7,Q的第一维是5。因此,N是,M是7。
需要注意的是,在上面的片段中,M和N并不仅仅代表“第一维”和“第二维”,所以在一般公式中使用它们作为占位符会有一定的误导性。

相关问题