1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Здравствуйте. Дана программа на Си (далее), потом она откомпилирована на ICC без оптимизации и с выдачей ассемблерного кода... кода тоже следует далее... вот задания которые нужно выполнить..прошу псмтреть и помочь...
Для тестовой программы (из первой лабораторной работы) сгенерировать ассемблерные листинги при компиляции с различными уровнями оптимизации. В программе использовать тип данных float. В каждом ассемблерном листинге:
1. Распознать вычислительную функцию, сопоставить команды языка Си с командами ассемблера.
2. Локализовать обращения в память, которые происходят при выполнении вычислительной функции. Определить позиции в исходной программе на Си, в которых происходят обращения в память. Посчитать общее число обращений в память при выполнении вычислительной функции (в зависимости от параметра задачи).
3. Определить, какие переменные и параметры вычислительной функции отображены на регистры, и какие размещены в памяти. Какие регистры используются для реализации вычислений (регистры общего назначения, регистры x87, MMX, XMM).
4. Описать видимые изменения в ассемблерном коде программы при переходе от одного уровня оптимизации к другому. Описать какие оптимизационные преобразования выполнил компилятор.
#include <stdio.h> #include <stdlib.h> #define N 1000 int Sort(int n) { int i, j; int tmp; float* mas; mas = (int *)malloc(sizeof(int)*1000000);
for(i = 0; i < n; i++) { mas[i] = rand(); } for(i = 0; i < n-1; i++) { for(j = 0; j < n - i -1; j++) { if(mas[j] > mas[j+1]) { tmp = mas[j]; mas[j] = mas[j+1]; mas[j+1] = tmp; } } } i = 0; for(i = 0; i < n; i++) printf("%10.2f ", mas[i]);
return 0; } int main(void) { int n = 0; n = 50000; Sort(n); return 0; }
# -- Begin Sort // начало функции Sort сортировки масива # mark_begin; align 4, 0x90 // деректива выравнивания, которая показывет, что // следующие команды должны быть вровнены по 4 м байтам .globl Sort Sort: # parameter 1: 8 + %ebx // параметры передаются через стек, адрес вершины которого находится // на регистре общего назначени esp. Для размещения локальных переменных // воспользуемся кадром, на который указывает ebx