- •Архитектура эвм и систем.
- •Стороженко а.С.
- •Валюкевич н.Е.
- •Оглавление
- •Введение Архитектура персонального компьютера
- •Набор регистров
- •Регистры состояния и управления
- •Организация памяти
- •Типы данных
- •Лабораторная работа №1 Применение inline assembler
- •Краткая теория
- •Функции ввода-вывода
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №2 Линейное программирование
- •Краткая теория
- •Команды пересылки данных
- •Арифметические команды
- •Сложение двоичных чисел без знака
- •Вычитание двоичных чисел без знака
- •Умножение двоичных чисел со знаком
- •Деление двоичных чисел со знаком
- •Преобразование типов
- •Порядок выполнения
- •Задания
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа №3 Организация ветвлений в программе
- •Краткая теория
- •Команда сравнения cmp
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №4 Циклы
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа №5 Циклы
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №6 Работа с дисассемблером
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Список рекомендованной литературы
- •Список дополнительной литературы
Порядок выполнения
С помощью методических указаний освоить работу с циклами.
Написать программу согласно варианту задания.
Оформить отчет.
Задания
1. Написать программу, вычисляющую арифметическое выражение в некотором диапазоне, согласно варианту. Значение переменных вводится с клавиатуры.
Варианты
Вариант 1
Вариант 2
Вариант 3
Вариант 4
Вариант 5
Вариант 6
Вариант 7
Вариант 8
Вариант 9
Вариант 10
Вариант 11
Вариант 12
Вариант 13
Вариант 14
Вариант 15
Вариант 16
Вариант 17
Контрольные вопросы
Расскажите при помощи, каких команд можно построить циклические вычисления.
Расскажите о сегментной организации памяти.
Расскажите о команде loop.
Расскажите, с точки зрения логической интерпретации, какие типы данных поддерживает микропроцессор фирмы Intel — i486 .
Расскажите о команде loope.
Расскажите о регистрах микропроцессора фирмы Intel — i486.
Расскажите о команде loopz.
Расскажите, с точки зрения размерности, какие типы данных поддерживает микропроцессор фирмы Intel — i486.
Расскажите о команде loopne.
Расскажите о регистрах сегментных регистрах реализованных в микропроцессорах фирмы Intel — i486.
Расскажите о команде loopze.
Приведите пример программы, где организованы циклические вычисление при помощи команды jmp.
Приведите основные архитектурные особенности микропроцессоров фирмы Intel — i486.
Приведите пример программы, где организованы циклические вычисление при помощи команды loop.
Приведите недостатоки команд организации цикла 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 операции.
