我试图更好地理解程序集x86 64的工作原理。最好的方法是解决一些练习,我试图解决一些问题,但现在我正在理解这个问题:
此处的主要操作是addl mat(%rdx, %rcx), %eax
。它与sum += mat[y][x]
相同。
通过查看程序集,我非常确定%rdx
是x
而%rcx
是y
。
因此,要了解MAT_X
是什么,我们可以看到y
的行为方式。在这种情况下,我们在第一个循环的每一端增加y
172,直到达到2924.
这意味着MAT_X = 2924/172 = 17
(推理是否正确?)。
而对于另一个我会说MAT_Y = 10
,因为x每次从0到10循环。
此问题的解决方案为MAT_X = 17
,但MAT_Y = 172/4 = 43
。
但我不明白为什么,我错了?
答案 0 :(得分:3)
保持冷静,你很亲密。 : - )
您可以在程序结束时看到编号2924。它是整个阵列的大小。换句话说,它就像MAT_X * MAT_Y = 2924.但是这个值以字节为单位! C / C ++语言计算可变大小的所有内容,这次它是int数组,即它的大小是2924字节= 2924/4 = 731 int' s。
在每行的末尾添加172,并且该数字是数组的最后一个维度的大小,即MAT_Y的基础。但同样,它在汇编程序中以字节为单位,因此您需要计算MAT_Y = 172/4 = 43。
让我们验证一下:
MAT_X = total size / MAT_Y = 731/43 = 17
MAT_X * MAT_Y * 4 = 17*43*4 = 2924