МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
ЗВІТ
до лабораторної роботи №1
з курсу “ Системне програмування ”
“ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ 32 РОЗРЯДНОГО АСЕМБЛЕРА”
Львів 2012
МЕТА
Ознайомитись з програмною моделлю 32 розрядних процесорів Intel та оволодіти навиками створення програм, використовуючи 32 розрядний асемблер.
ЗАВДАННЯ
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу. A={a[i]} – попередньозаданий масив з N чисел. c, d - константи.
Переконатися у правильності роботи програми використовуючи VKDebug.
Скласти звіт про виконану роботу з приведенням тексту програми.
Дати відповідь на контрольні запитання.
Завдання згідно варіанту:
4
Знайти скільки від’ємних елементів в масиві A={a[i]} мають непарні індекси
ТЕОРЕТИЧНІ ВІДОМОСТІ
Програмна модель комп'ютера, частиною якої є програмна модель мікропроцесора, яка містить 32 регістри в тій чи іншій мірі доступних для використання програмістом. Дані регістри можна розділити на дві великі групи:
16 регістрів користувача;
16 системних регістрів.
У програмах на мові асемблера регістри використовуються дуже інтенсивно. Більшість регістрів мають певне функціональне призначення.
Робота з масивами
Регістри загального призначення використовуються для адресації масивів. При цьому застосовується адресація по базі з масштабуванням: початкова адреса + база* масштабуючий коефіцієнт бази. Допустимі значення масштабуючого коефіцієнту бази (кількість байт, які займає 1 елемент масиву) рівні 1, 2, 4, 8.
Таким чином, щоб записати 3-й елемент масиву оголошеного мовою С як short arr[15] в edx треба написати код:
mov eax, arr
mov ebx, 2
mov edx,[eax+ebx*2]
Регістри загального призначення
Всі регістри цієї групи дозволяють звертатися до своїх “молодших” частин (див. рис. 1).
Відмітимо, що використовувати для самостійної адресації можна тільки молодші 16 і 8-бітові частини цих регістрів. Старші 16 біт цих регістрів як самостійні об'єкти недоступні.
До РЗП відносяться:
eax/ax/ah/al (Accumulator register) — акумулятор.
Застосовується для зберігання проміжних даних. У деяких командах використання цього регістра обов'язкове;
ebx/bx/bh/bl (Base register) — базовий регістр.
Застосовується для зберігання базової адреси деякого об'єкту в пам'яті;
ecx/cx/ch/cl (Count register) — регістр-лічильник.
Застосовується в командах, що проводять деякі дії, що повторюються. Його використання часто неявно і приховано в алгоритмі роботи відповідної команди. Наприклад, команда організації циклу loop окрім передачі управління команді, що знаходиться за деякою адресою, аналізує і зменшує на одиницю значення регістра ecx/cx;
edx/dx/dh/dl (Data register) — регістр даних.
Так само, як і регістр eax/ax/ah/al, він зберігає проміжні дані. У деяких командах його використання обов'язково; для деяких команд це відбувається неявно.
Наступні два регістри використовуються для підтримки операцій, що проводять послідовну обробку ланцюжків елементів, кожний з яких може мати довжину 32, 16 або 8 біт:
esi/si (Source Index register) — індекс джерела.
edi/di (Destination Index register) — індекс приймача (одержувача).
У архітектурі мікропроцесора на програмно-апаратному рівні підтримується така структура даних, як стек. Для роботи із стеком в системі команд мікропроцесора є спеціальні команди, а в програмній моделі мікропроцесора для цього існують спеціальні регістри:
esp/sp (Stack Pointer register) — регістр покажчика стека. Містить покажчик вершини стека в поточному сегменті стека.
ebp/bp (Base Pointer register) — регістр покажчика бази кадру стека. Призначений для організації довільного доступу до даних усередині стека.
Використання жорсткого закріплення регістрів для деяких команд дозволяє компактніше кодувати їх машинне уявлення. Знання цих особливостей дозволить вам при необхідності хоч би на декілька байт заощадити пам'ять, займану кодом програми.
/
Рис. 1. Регістри користувача мікропроцесорів i486 і Pentium
КОД ПРОГРАМИ
.586
; використати плоску модель пам'яті і узгодження імен stdcall
.model flat, stdcall
option casemap: none
; оголошення службових процедур, макросів, змінних, констант
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\include\debug.inc
; підключення службових бібліотек
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\debug.lib
; оголошення масиву даних
.data
Arr dd 1,-2,-3,-4,5
.code
start:
mov ecx,5
mov ebx,0
prnt:
mov eax,[Arr+ecx*4-4]
cmp ecx,0
jp mitka
cmp eax,0
jge mitka
inc ebx
mitka:
dec ecx
cmp ecx,0
jnz prnt
PrintDec ebx,"Count positive"
invoke ExitProcess, NULL ; виклик процедури завершення процесу
end start
РЕЗУЛЬТАТ ВИКОНАННЯ ПРОГРАМИ
/
ВИСНОВОК
В даній лабораторній роботі я ознайомився з програмною моделлю 32 розрядних процесорів Intel та оволодів навиками створення програм, використовуючи 32 розрядний асемблер.