- •2. Команди додавання і віднімання.
- •3. Команди множення й ділення.
- •Індивідуальні завдання:
- •Контрольний приклад
- •Індивідуальні завдання:
- •Контрольний приклад
- •Індивідуальні завдання:
- •Контрольний приклад
- •Індивідуальні завдання.
- •Команда lea. При використанні регістрів-модифікаторів часто доводиться записувати в них ті чи інші адреси. Нехай, наприклад, нам необхідно занести в регістр вх адресі змінної X:
- •Контрольний приклад
- •1. Сегментування адрес у пк
- •1.1. Загальна схема базування адрес
- •1.2. Особливості сегментування адрес у пк
- •Zzzzz - абсолютна адреса
- •1.3. Сегментні регістри за замовчуванням
- •2. Програмні сегменти
- •2.1. Значення імені сегмента
- •2.2. Адресні змінні
- •Bl dw а2 еквівалентно Bl dw offset а2 в2 dd а2 еквівалентно в2 dd вод а2 : offset a2
- •Індивідуальні завдання:
- •Контрольний приклад
- •1. Схема базування адреси в пк?
- •Invoke виpаз [, аpгументи]
- •Invoke ExitProcess, 0
- •Invoke ExitProcess, 0
- •Invoke MessageBox, null, addr MsgBoxText, addr MsgBoxCaption, mb_ok
- •Invoke ExitProcess, null
- •Invoke MessageBox,null, addr MsgBoxText,addr MsgBoxCaption,mb_ok
- •Хід роботи:
- •Написати програму, що створює полнофункціональну Windows пpогpаму, яка виводить повідомлення "Win32 assembly is great!".
- •Контрольні питання:
- •Лабораторна робота n 2
- •Теоретичні відомості.
- •Invoke LoadIcon,null,idi_application
- •Invoke LoadCursor,null,idc_arrow
- •Invoke RegisterClassEx, addr wc ; Регістpація нашого класу вікна
- •Inst:hinstance,hPrevInst:hinstance,CmdLine:lpstr,CmdShow:dword
- •Invoke LoadIcon,null,idi_application
- •Invoke LoadCursor,null,idc_arrow
- •Invoke RegisterClassEx, addr wc
- •Invoke ShowWindow, hwnd,CmdShow
- •Invoke UpdateWindow, hwnd
- •Invoke GetMessage, addr msg,null,0,0
- •Invoke TranslateMessage, addr msg
- •Invoke DispatchMessage, addr msg
- •Invoke PostQuitMessage,null
- •Invoke DefWindowProc,hWnd,uMsg,wParam,lParam
- •Хід роботи:
- •Контрольні питання:
- •Лабораторна робота n 3
- •Теоретичні відомості.
- •Invoke BeginPaint,hWnd, addr ps
- •Invoke GetClientRect,hWnd, addr rect
- •Invoke EndPaint,hWnd, addr ps
- •Лабораторна робота n 4
- •Теоретичні відомості.
- •Invoke InvalidateRect, hWnd,null,true
- •Хід роботи:
- •Контрольні питання:
- •Характеристика повідомлень, що посилають від клавіатури.
- •Лабораторна робота n 5
- •Теоретичні відомості.
- •Invoke lstrlen,addr AppName
- •Invoke TextOut,hdc,hitpoint.X,hitpoint.Y,addr AppName,eax
- •Хід роботи:
- •Контрольні питання:
- •Лабораторна робота n 6
- •Теоретичні відомості.
- •Invoke LoadMenu, hInst, offset MenuName
- •Invoke LoadMenu, hInst, offset MenuName
- •Хід роботи:
- •Контрольні питання:
Контрольний приклад
program al1;
uses crt;
var i,z,j,min:integer;
a: array [1..2,1..2] of integer;
label m,m1,m2;
begin
clrscr;
for i:=1 to 2 do
for j:=1 to 2 do
begin
write('input a[',i,',',j,']=');
readln(a[i,j]);
end;
min := 32000;{ініціалізація змінної}
asm
xor bx,bx
xor ax,ax
lea bx,a
mov cx,2
m: push cx
mov cx,2
mov si,0
m1: mov ax,[bx][si]
cmp ax,min
jge m2
mov min,ax
m2: add si,2
loop m1
pop cx
add bx,4
loop m
end;
writeln('min=',min);
readkey;
end.
Порядок виконання роботи
1. Вивчити теоретичні відомості.
3. Написати програму.
4. Зробити звіт .
Зміст звіту
1. Теоретичні відомості.
2. Текст програми.
3. Результати.
4. Висновки.
5. Відповіді на контрольні питання.
Контрольні питання
1. Як нумеруються елементи масиву?
2. Як залежить адреса елемента масиву від індексу цього елемента?
3. Як здійснюється доступ до елементів масиву?
Лабораторна робота N 5
Тема роботи: Програмні сегменти.
Мета роботи: Навчитися розробляти повну програму мовою Асемблер.
Теоретичні відомості.
Дотепер ми вважали, що в ПК використаються 16-розрядні адреси. Але настав час згадати, що обсяг пам'яті ПК дорівнює 220 байтів (1 Мб), а це вимагає 20-розрядних адрес. У даній лабораторній роботі розглядається, як наявність таких 20-розрядних адрес позначається на програмах і як виглядає повна програма на мові Асемблер.
1. Сегментування адрес у пк
1.1. Загальна схема базування адрес
ПК відноситься до ЕОМ, у яких заради скорочення розміру команд використовується базування адрес. Тому насамперед розглянемо, що таке базування адрес в ЕОМ.
Якщо в оперативній пам'яті ЕОМ є 2К осередків, то для посилань на ці осередки потрібні k-розрядні адреси; будемо називати їх абсолютними адресами (інша назва - фізичні адреси). Ясно, що при великому обсязі пам'яті великим буде розмір абсолютних адрес, а це веде до збільшення довжини команд й надалі до збільшення розміру програм у цілому. Це погано. Щоб скоротити розміри команд, використовують такий спосіб. Пам'ять умовно поділяють на ділянки, які прийнято називати сегментами. Початкові адреси сегментів (ці адреси називаються базами) можуть бути будь-якими, але на довжини сегментів накладається обмеження: розмір будь-якого сегмента не повинен перевершувати, скажемо, 2 m осередків, де m<k. У цих умовах абсолютну адресу А будь-якої комірки пам'яті можна представити у вигляді суми A=B+ofs, де В - база сегмента, до якого ставиться осередок А, а ofs зсув (offset) або відносна адреса осередку, тобто її адреса, відлічена початку сегмента, від адреси В:
Обмеження розміру сегментів означає, що 0<=ofs=2m-l, і тому для запису зсувів досить m розрядів. Отже, у сумі А=В+ofs більша адреси А доводиться на базу В, а ofs - це лише невеликий додаток. З огляду на це надходимо в такий спосіб. Якщо в команді треба вказати абсолютну адресу А, більший додаток - базу В - "ховаємо" у деякий регістр R, а в команді вказуємо лише цей регістр і менший додаток ofs, тобто замість команди
КІП ... А...
використаємо команду
КІП ... R ofs ...
Що це дає? Оскільки команда працює з виконавчою адресою, а віна обчислюється по формулі [k]+ofs=B+ofs=A, то ця команда буде працювати з потрібною нам адресою А. З іншого боку, поля R і ofs займають мало місця в команді, тому розмір команди зменшиться - у порівнянні з тим случаємо, коли в команді вказується абсолютна адреса. До цього ми й прагнули.
Відзначимо попутно, що, записавши один раз у регістр R базу сегмента, далі ми можемо, не міняючи значення цього регістра, використати його для доступу до всіх осередків даного сегмента. І якщо дані програми розташовуються в пам'яті компактно, то засилань баз у регістри буде небагато.
Регістри, у яких зберігаються бази, прийнято називати базовими регістрами, а спосіб запису в командах не абсолютних адрес, а базових регістрів і зсувів, називається базуванням адрес.
Така загальна схема базування адрес, використана в багатьох ЕОМ. У ПК використовується ця ж схема, але з рядом особливостей, які ми зараз і розглянемо.
