Категория
Информатика
Тип
курсовая работа
Страницы
45 стр.
Дата
20.06.2013
Формат файла
.doc — Microsoft Word
Архив
692039.zip — 96.25 kb
  • dizassemblirovanie_692039_1.doc — 321.5 Kb
  • Readme_docus.me.txt — 125 Bytes
Оцените работу
Хорошо  или  Плохо



Текст работы

xxx", а конструкцию "SUB a,
const" транслировать в "ADD a, -const", которая ничуть не компактнее и ни
сколь не быстрей (и та, и другая укладываться в один так). Рассмотрим это в
следующем примере:
main()
{
int a,b,c;
c = a - b;
printf("%x\n",c);
c = c - 10;
printf("%x\n",c);
}
Демонстрация идентификации оператора "-"
Не оптимизированный вариант будет выглядеть приблизительно так:
main proc near ; CODE XREF:
start+AF p
var_c = dword ptr -0Ch
var_b = dword ptr -8
var_a = dword ptr -4
push ebp
mov ebp, esp
; Открываем кадр стека
sub esp, 0Ch
; Резервируем память под локальные переменные
mov eax, [ebp+var_a]
; Загружаем в EAX значение переменной var_a
sub eax, [ebp+var_b]
; Вычитаем из var_a значением переменной var_b, записывая результат в EAX
mov [ebp+var_c], eax
; Записываем в var_c разность var_a и var_b
; var_c = var_a - var_b
mov ecx, [ebp+var_c]
push ecx
push offset asc_406030 ; "%x\n"
call _printf
add esp, 8
; printf("%x\n", var_c)
mov edx, [ebp+var_c]
; Загружаем в EDX значение переменной var_c
sub edx, 0Ah
; Вычитаем из var_c значение 0xA, записывая результат в EDX
mov [ebp+var_c], edx
; Обновляем var_c
; var_c = var_c - 0xA
mov eax, [ebp+var_c]
push eax
push offset asc_406034 ; "%x\n"
call _printf
add esp, 8
; printf("%x\n",var_c)
mov esp, ebp
pop ebp
; Закрываем кадр стека
retn
main endp
Теперь рассмотрим оптимизированный вариант того же примера:
main proc near ; CODE XREF:
start+AF p
push ecx
; Резервируем место для локальной переменной var_a
mov eax, [esp+var_a]
; Загружаем в EAX значение локальной переменной var_a
push esi
; Резервируем место для локальной переменной var_b
mov esi, [esp+var_b]
; Загружаем в ESI значение переменной var_b
sub esi, eax
; Вычитаем из var_a значение var_b, записывая результат в ESI
push esi
push offset asc_406030 ; "%x\n"
call _printf
; printf("%x\n", var_a - var_b)
add esi, 0FFFFFFF6h
; Добавляем к ESI (разности var_a и var_b) значение 0хFFFFFFF6
; Поскольку, 0xFFFFFFF6 == -0xA, данная строка кода выглядит так:
; ESI = (var_a - var_b) + (- 0xA) = (var_a - var_b) - 0xA
push esi
push offset asc_406034 ; "%x\n"
call _printf
add esp, 10h
; printf("%x\n", var_a - var_b - 0xA)
pop esi
pop ecx
; Закрываем кадр стека
retn
main endp
Компиляторы (Borland, WATCOM) генерируют практически идентичный код.
1.3 Идентификация оператора "/"



Ваше мнение



CAPTCHA