C和装配测验

时间:2017-02-02 23:02:44

标签: c loops assembly x86 x86-64

我试图更好地理解程序集x86 64的工作原理。最好的方法是解决一些练习,我试图解决一些问题,但现在我正在理解这个问题:

enter image description here

此处的主要操作是addl mat(%rdx, %rcx), %eax。它与sum += mat[y][x]相同。 通过查看程序集,我非常确定%rdxx%rcxy

因此,要了解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

但我不明白为什么,我错了?

1 个答案:

答案 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