Лабораторная работа №6. if(a>0&&b<10)f=x*(a+b)/50
Работа с дисассемблером Цель работы: освоить работу с дисассемблером. Оборудование: персональный компьютер, Microsoft Visual Studio. Краткая теория Дизассемблер – транслятор, преобразующий машинный код, объектный файл или библиотечный модуль в текст программы на языке ассемблер. Чаще всего дизассемблер используют для анализа программ (или ее части) с целью модификации, копирования, взлома, поиска ошибок (багов), анализа оптимизации создаваемого компиляторами машинного кода. Лучшим способом иллюстрировать работу с дизассемблером является рассмотрение его работы на некотором примере. Далее рассмотрим следующий пример. Пример Необходимо написать программу, вычисляющую в некотором диапазоне следующее арифметическое выражение: После чего необходимо провести анализ эффективности программы на написанной на языке С++ и ассемблере. Ниже приведен листинг этой программы.
#include " stdafx.h"
#include < iostream> using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { int a, b, c, x, f;
cout< < " Enter a="; cin> > a; cout< < " Enter b="; cin> > b; cout< < " Enter c="; cin> > c; cout< < " Enter x="; cin> > x;
if (a> 0& & b< 10)f=x*(a+b)/50; Else if (a< 0)f=x*a+b/7; else f=x%6+c+b;
Asm { cmp a, 0 jle next1 cmp b, 10 jge next1 mov eax, a cdq add eax, b imul x mov ecx, 50 idiv ecx mov f, eax jmp my_exit next1: cmp a, 0 jge next2 mov eax, x cdq imul a mov ebx, eax mov eax, b cdq mov ecx, 7 idiv ecx add eax, ebx mov f, eax jmp my_exit next2: mov eax, x cdq mov ecx, 6 idiv ecx add edx, c add edx, b mov f, edx
my_exit: };
cout< < " f=" < < f< < endl;
system(" pause"); return 0; }
После того как программа написана необходимо установить точку останова. Дело в том, что дисассемблер можно вызвать только при выполнении программы и если ее не остановить, то она завершиться автоматически. Точку останова можно установить, нажав левой кнопкой мыши на сером поле с лево от написанного кода (рисунок 26).
Рисунок 26 – Установка точки останова
После того как точка останова установлена, запускаем программу, вводим необходимые данные и запускаем дизассемблер. Для запуска дизассемблера необходимо выбрать пункт меню «Отладка» u«Окна»u«Дизассемблированный код» (рисунок 27).
Рисунок 27 – Выбор меню дизассемблера
После вызова окна дизассемблера программа представляется в следующем виде: сначала указывается исходный код программы, затем сгенерированные коды ассемблера. Частичный листинг программы (В листинг не вошли: строчки кода которые устанавливают значения переменных, строчки кода выводящие результат и завершающие программу) в окне дизассемблера представлен ниже:
if(a> 0& & b< 10)f=x*(a+b)/50; 0041158E cmp dword ptr [a], 0 00411592 jle wmain+0F1h (4115B1h) 00411594 cmp dword ptr [b], 0Ah 00411598 jge wmain+0F1h (4115B1h) 0041159A mov eax, dword ptr [a] 0041159D add eax, dword ptr [b] 004115A0 imul eax, dword ptr [x] 004115A4 cdq 004115A5 mov ecx, 32h 004115AA idiv eax, ecx 004115AC mov dword ptr [f], eax Else 004115AF jmp wmain+124h (4115E4h) if(a< 0)f=x*a+b/7; 004115B1 cmp dword ptr [a], 0 004115B5 jge wmain+110h (4115D0h) 004115B7 mov ecx, dword ptr [x] 004115BA imul ecx, dword ptr [a] 004115BE mov eax, dword ptr [b] 004115C1 cdq 004115C2 mov esi, 7 004115C7 idiv eax, esi 004115C9 add ecx, eax 004115CB mov dword ptr [f], ecx 004115CE jmp wmain+124h (4115E4h) else f=x%6+c+b; 004115D0 mov eax, dword ptr [x] 004115D3 cdq 004115D4 mov ecx, 6 004115D9 idiv eax, ecx 004115DB add edx, dword ptr [c] 004115DE add edx, dword ptr [b] 004115E1 mov dword ptr [f], edx
Asm {
|