МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ, МОЛОДІ ТА СПОРТУ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
Лабораторна робота № 1
. ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ 32 РОЗРЯДНОГО АСЕМБЛЕРА
Мета роботи: Ознайомитись з програмною моделлю 32 розрядних процесорів Intel та оволодіти навиками створення програм, використовуючи 32 розрядний асемблер.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Програмна модель комп'ютера, частиною якої є програмна модель мікропроцесора, яка містить 32 регістри в тій чи іншій мірі доступних для використання програмістом. Дані регістри можна розділити на дві великі групи:
16 регістрів користувача;
16 системних регістрів.
У програмах на мові асемблера регістри використовуються дуже інтенсивно. Більшість регістрів мають певне функціональне призначення.
Регістри користувача
Як випливає з назви, призначеними для користувача регістри називаються тому, що програміст може використовувати їх при написанні своїх програм. До цих регістрів відносяться (рис.1):
вісім 32-бітових регістрів, які можуть використовуватися програмістами для зберігання даних і адрес (їх ще називають регістрами загального призначення (РЗП)):
eax/ax/ah/al;
ebx/bx/bh/bl;
edx/dx/dh/dl;
ecx/cx/ch/cl;
ebp/bp;
esi/si;
edi/di;
esp/sp.
шість сегментних регістрів: cs, ds, ss, es, fs, gs;
регістри управління та стану:
регістр прапорів eflags/flags;
регістр покажчика команди eip/ip.
Чому багато з цих регістрів приведені з розділовою межею? (рис. 1)Ні, це не різні регістри — це частини одного великого 32-розрядного регістра. Їх можна використовувати в програмі як окремі об'єкти. Так зроблено для забезпечення працездатності програм, написаних для молодших 16-розрядних моделей мікропроцесорів фірми Intel, починаючи з i8086. Мікропроцесори i486 і Pentium мають в основному 32-розрядні регістри. Їх кількість, за винятком сегментних регістрів, таке ж, як і у i8086, але розмірність більше, що і відбито в їх позначеннях — вони мають приставку e (Extended).
Регістри загального призначення
Всі регістри цієї групи дозволяють звертатися до своїх “молодших” частин (див. рис. 1).
Відмітимо, що використовувати для самостійної адресації можна тільки молодші 16 і 8-бітові частини цих регістрів. Старші 16 біт цих регістрів як самостійні об'єкти недоступні.
До РЗП відносяться:
eax/ax/ah/al (Accumulator register) — акумулятор.
Застосовується для зберігання проміжних даних. У деяких командах використання цього регістра обов'язкове;
ebx/bx/bh/bl (Base register) — базовий регістр.
ЗАВДАННЯ
Створити 0*.exe програму, яка реалізовує обчислення, заданого варіантом виразу. A={a[i]} – попередньозаданий масив з N чисел. c, d - константи.
Переконатися у правильності роботи програми використовуючи VKDebug.
Скласти звіт про виконану роботу з приведенням тексту програми.
14. Знайти скільки нульових елементів в масиві A={a[i]}
Код програми
.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
include \masm32\include\user32.inc
; підключення службових бібліотек
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\debug.lib
includelib \masm32\lib\user32.lib
.data
Arr dd 5,4,0,0,0,0,2,0,5,6,0,6,0,4,8,12,4,0,9,0
Zeros dd 0
L dd 20
.code
start:
mov ecx, 0
Start_1:
mov eax, [Arr + ecx*4]
PrintDec eax
.if eax == 0
add Zeros, 1
mov eax, Zeros
.endif
inc ecx
cmp ecx, L
jnz Start_1
PrintDec Zeros, "Result: "
invoke ExitProcess, NULL ; виклик процедури завершення процесу
end start
Результат виконання програми
/
Висновок: я ознайомився з програмною моделлю 32 розрядних процесорів Intel та оволодів навиками створення програм, використовуючи 32 розрядний асемблер.