我试图更好地理解程序集x86 64的工作原理。最好的方法是解决一些练习,我试过解决一些,但现在我仍然无法理解这一点:
c - C和汇编测验-LMLPHP
这里的主要操作是addl mat(%rdx, %rcx), %eax。与sum += mat[y][x]相同。
通过查看程序集,我确信%rdxx并且%rcxy
因此,为了找出MAT_X是什么,我们可以看到y的行为。在这种情况下,我们在第一个循环的每一端增加172y,直到达到2924。
这意味着MAT_X = 2924/172 = 17(推理是否正确?).
对于另一个,我会说MAT_Y = 10,因为x每次循环从0到10。
这个问题的解决方案是MAT_X = 17但是MAT_Y = 172/4 = 43
但我不明白为什么我错了?

最佳答案

保持冷静,你已经很接近了。:-)
你可以在节目结束时看到2924号。它是整个数组的大小。换句话说,它就像MAT_X*MAT_Y=2924。但这个值是以字节为单位的!C/C++语言计算变量大小的所有内容,这次是int数组,即它的大小是2924字节=2924/4=731 int。
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

07-24 09:44