2017-02-02 47 views
1

Я пытаюсь понять, как работает сборка x86 64. И лучший путь решения некоторых упражнений, я пытался решить некоторые, но теперь я в настоящее время застрял понимание этого один:C и Assembly Quiz

enter image description here

Основная работа здесь addl mat(%rdx, %rcx), %eax. Это то же самое, что и sum += mat[y][x]. Взглянув на сборку, я уверен, что %rdx is x и %rcx is 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.

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 
+0

Спасибо за ответ, но я немного смущен размером последнего измерения, которое вы говорите, 172, потому что мы получаем мат, используя y в первом измерении кода, и это меня немного смущает ... Мы знаете, что в цикле y должно быть меньше, чем MAT_Y, но мы используем его для доступа к первому измерению, и, следовательно, мы не могли бы фактически выходить из басов? Теперь, когда я думаю об этом, этот пример, похоже, выходит за рамки или нет? – DevX10

+0

Потому что мы могли бы иметь мат [42] [x] ', но MAT_X = 17 – DevX10

+0

Хорошо, вы правы. Исходный код C не является хорошим кодом качества. Но код asm, представленный в примере, действительно основан на этом C-коде. :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^