Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания по Архитектуре ЭВМ и сист...doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.69 Mб
Скачать

Порядок выполнения

  1. С помощью методических указаний освоить работу с циклами.

  2. Написать программу согласно варианту задания.

  3. Оформить отчет.

Задания

1. Написать программу, вычисляющую арифметическое выражение в некотором диапазоне, согласно варианту. Значение переменных вводится с клавиатуры.

Варианты

Вариант 1

Вариант 2

Вариант 3

Вариант 4

Вариант 5

Вариант 6

Вариант 7

Вариант 8

Вариант 9

Вариант 10

Вариант 11

Вариант 12

Вариант 13

Вариант 14

Вариант 15

Вариант 16

Вариант 17

Контрольные вопросы

  1. Расскажите при помощи, каких команд можно построить циклические вычисления.

  2. Расскажите о сегментной организации памяти.

  3. Расскажите о команде loop.

  4. Расскажите, с точки зрения логической интерпретации, какие типы данных поддерживает микропроцессор фирмы Intel — i486 .

  5. Расскажите о команде loope.

  6. Расскажите о регистрах микропроцессора фирмы Intel — i486.

  7. Расскажите о команде loopz.

  8. Расскажите, с точки зрения размерности, какие типы данных поддерживает микропроцессор фирмы Intel — i486.

  9. Расскажите о команде loopne.

  10. Расскажите о регистрах сегментных регистрах реализованных в микропроцессорах фирмы Intel — i486.

  11. Расскажите о команде loopze.

  12. Приведите пример программы, где организованы циклические вычисление при помощи команды jmp.

  13. Приведите основные архитектурные особенности микропроцессоров фирмы Intel — i486.

  14. Приведите пример программы, где организованы циклические вычисление при помощи команды loop.

  15. Приведите недостатоки команд организации цикла loop, loope/loopz и loopne/loopnz.

Лабораторная работа №6 Работа с дисассемблером

Цель работы: освоить работу с дисассемблером.

Оборудование: персональный компьютер, 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 – Установка точки останова

После того как точка останова установлена, запускаем программу, вводим необходимые данные и запускаем дизассемблер. Для запуска дизассемблера необходимо выбрать пункт меню «Отладка» «Окна»«Дизассемблированный код» (рисунок 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

{

cmp a,0

004115E4 cmp dword ptr [a],0

jle next1

004115E8 jle next1 (411606h)

cmp b,10

004115EA cmp dword ptr [b],0Ah

jge next1

004115EE jge next1 (411606h)

mov eax,a

004115F0 mov eax,dword ptr [a]

cdq

004115F3 cdq

add eax,b

004115F4 add eax,dword ptr [b]

imul x

004115F7 imul dword ptr [x]

mov ecx,50

004115FA mov ecx,32h

idiv ecx

004115FF idiv eax,ecx

mov f,eax

00411601 mov dword ptr [f],eax

jmp my_exit

00411604 jmp my_exit (41163Bh)

next1:

cmp a,0

00411606 cmp dword ptr [a],0

jge next2

0041160A jge next2 (411627h)

mov eax,x

0041160C mov eax,dword ptr [x]

cdq

0041160F cdq

imul a

00411610 imul dword ptr [a]

mov ebx,eax

00411613 mov ebx,eax

mov eax,b

00411615 mov eax,dword ptr [b]

cdq

00411618 cdq

mov ecx,7

00411619 mov ecx,7

idiv ecx

0041161E idiv eax,ecx

add eax,ebx

00411620 add eax,ebx

mov f,eax

00411622 mov dword ptr [f],eax

jmp my_exit

00411625 jmp my_exit (41163Bh)

next2:

mov eax,x

00411627 mov eax,dword ptr [x]

cdq

0041162A cdq

mov ecx,6

0041162B mov ecx,6

idiv ecx

00411630 idiv eax,ecx

add edx,c

00411632 add edx,dword ptr [c]

add edx,b

00411635 add edx,dword ptr [b]

mov f,edx

00411638 mov dword ptr [f],edx

my_exit:

};

Для дальнейшего анализа необходимо посчитать количество строчек сгенерированного кода на языке ассемблер. После подсчетов участок кода написанный на языке С++ был транслирован в 30 строчек кода (начиная со строчки с номером 0041158E и заканчивая 004115E1), а участок кода написанный на языке ассемблер в 32 строчки кода (начиная со строчки с номером 004115E4 и заканчивая 00411638). После получения количественных результатов можно заключить, что код написанный на языке С++ был эффективней на 2 операции.