2017-02-02 44 views
1

我想更好地瞭解程序集x86 64如何工作。而最好的辦法就是解決一些練習,我試圖解決一些,但現在我目前瞭解卡住這一個:C和大會測驗

enter image description here

這裏的主要操作是addl mat(%rdx, %rcx), %eax。這與sum += mat[y][x]相同。 通過看看大會我很確定%rdxx%rcxy。我們可以看到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。

172被添加在每行的末尾,並且這個數字是該數組的最後一個維度的大小,即MAT_Y的基礎。但同樣,它是在彙編字節,所以你需要計算MAT_Y =4分之172= 43

讓我們驗證:

MAT_X = total size/MAT_Y = 731/43 = 17 
MAT_X * MAT_Y * 4 = 17*43*4 = 2924 
+0

感謝您的回答,但我對您說172是最後一個維度的大小有點困惑,因爲我們在代碼的第一維中使用y訪問mat,這使我困惑了一些......我們知道在循環中y必須小於MAT_Y,但我們用它來訪問第一維,因此我們不能真正走出bouns嗎?現在我正在考慮這個例子,這個例子似乎超出了界限? – DevX10

+0

因爲我們可以有'mat [42] [x]'但是MAT_X = 17 – DevX10

+0

好點,你說得對。原始的C代碼不是一個很好的質量代碼。但示例中提供的asm代碼實際上基於該C代碼。 :-) –