
- •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
- •Хід роботи:
- •Контрольні питання:
Індивідуальні завдання:
Розрахувати значення функції (значення змінної "а" задати на власний розсуд), використовуючи команди:
а) умовного переходу
б) циклів
1.
f = 3x +4y -5
x [ 1..10], крок 2
y [1..20], крок 4
Якщо f > a розрахунки припинити
2.
f = 4x +3y -2z
x [ 1.. 5], крок 1
y [10..20], крок 2
3.
f = 7x +3y
x [ 1..20], крок 4
Якщо xy > a розрахунки припинити
4.
f = 3/y +4z -20
y [-1..10], крок 1, y <> 0
z [ 3.. 9], крок 3
5.
f = 3y -4x -2z
y [ 2..10], крок 2
z [ 1..15], крок 3
Якщо yz > a розрахунки припинити
6.
f = 7x +3y -10z
x [10.. 1], крок -1
z [ 5..20], крок 5
Якщо x = y розрахунки припинити
7.
f = 7(x +y) -3y +5z
y [ 1..20], крок 2
Якщо y^2 > z розрахунки припинити
8.
f = 7x^2 -3y^2 +y
x [10.. 5], крок -1
Якщо x^2 > y^2 розрахунки припинити
9.
f = (7y -3z)x
y [20.. 2], крок -2
Якщо yz > x розрахунки припинити
10.
f = 10(y -z)x
y [ 1.. 5], крок 1
x [ 2..10], крок 2
11.
f = 6x +4y -5z
x [ 1..10], крок 1
y [1..20], крок 4
Якщо f => a розрахунки припинити
12.
f = 4x +8y -2z
x [ 1.. 15], крок 5
y [10..20], крок 2
13.
f = 3/y +4z -2x
y [1..10], крок 1
z [ 3.. 9], крок 3
14.
f = 3y +4x -6z
y [ 2..10], крок 2
z [ 1..15], крок 3
Якщо yz > a розрахунки припинити
15.
f = (7x +3y)/4+z-1
x [1.. 10], крок 1
z [ 5..20], крок 5
Якщо xy=a розрахунки припинити
16.
f = 7(x +y)+5z
y [ 1..20], крок 2
z [ 5..20], крок 5
Якщо y^2 > z розрахунки припинити
17.
f =(7x -3y)z+y-1
x [10.. 5], крок -1
z [ 1..20], крок 4
Якщо x^2 > y^2 розрахунки припинити
18.
f = (7y+3z)x-3y
y [20.. 2], крок -2
z [ 1..20], крок 5
Якщо yz > x розрахунки припинити
19.
f = 10(y+z)x-5
y [ 1.. 5], крок 1
x [ 2..10], крок 2
20.
f = 3x +4y -5z
x [ 1..10], крок 2
y [1..20], крок 4
Якщо f= a розрахунки припинити
21.
f = (4x +3y)/2-2z
x [ 1.. 5], крок 1
y [10..20], крок 2
22.
f = 7x +3y+4xy
x [ 1..20], крок 4
Якщо xy=a розрахунки припинити
23.
f = 3y +4z+2x
y [-1..10], крок 1
z [ 3.. 9], крок 3
24.
f = 3y+4x+2z-1
y [ 2..10], крок 2
z [ 1..15], крок 3
Якщо yz=a розрахунки припинити
Контрольний приклад
f = 7x +3y-3
x [ 1..20], крок 4
y [10..20], крок 2
Якщо xy > a розрахунок зупинити
program al1;
uses crt;
var x,y,f,a:integer;
label a1,a2,stop;
begin
clrscr;
write('Input a=');
readln(a);
asm
mov x,1
a2: mov y,10
a1: mov ax,7
imul x
mov bx,3
xchg ax,bx
imul y
add ax,bx
sub ax,3
add y,2
mov cx,x
xchg cx,ax
imul y
xchg cx,ax
cmp cx,a
jg stop
cmp y,20
jle a1
add x,4
cmp x,20
jle a2
stop:
mov f,ax
end;
writeln('x=',x);
writeln('y=',y);
writeln('f=',f);
readkey;
end.
Порядок виконання роботи
1. Вивчити команди циклу.
3. Написати програму.
4. Зробити звіт .
Зміст звіту
1. Опис команд циклу.
2. Текст програми.
3. Результати.
4. Висновки.
5. Відповіді на контрольні питання.
Контрольні питання
1. Коли використовується команда LOOPNE?
2. Коли використовується команда LOOPE?
3. Коли використовується команда LOOPNZ?
Лабораторна робота N 4
Тема роботи: Робота з масивами.
Мета роботи: Навчитися працювати з масивами.
Теоретичні відомості.
При описі масиву вказується кількість елементів у ньому та їх тип:
x dw 30 dup(?),
проте не вказується як нумеруються (індексуються) його елементи.
Описанню може відповідати масив:
x [0..29]
x [1..30]
x [k..29+k]
Автор програми може накладати на масив різноманітні діапазони зміни індекса. Іноді діапазон індексів суворо визначено в умові задачі. Якщо нумерація строго не визначена, тоді краще почати нумерацію з нуля.
Як залежить адреса елемента від індексу цього елемента:
x dw 30 dup(?); x [k..29+k] =>
адреси (x[i])=x+2*(i-k)
адреси (x[i])=x+(type x)*(i-k)
при k =0
адреси (x[i])=x+(type x)*i
Тому зазвичай вважають , що елементи в асемблері нумеруються з 0:
x dw 30 dup(?); x [0..29]
Для багатомірних масивів ситуація аналогічна:
А [ N * M ]
N,M - const
N - кількість рядків
M - кількість стовбців
Припустимо, що елементи матриці розміщені в пам'яті по рядках (можна розміщувати й по стовбцям):
адреси (A [i,j])=A+M*(type A)*(i-k*M)+(type A)*(i-k*N)
Найбільш доступний вигляд ця залежність приймає при нумерації з 0.
Як здійснюється доступ до елементів масиву?
До цього моменту ми працювали з командами, у яких для операндів вказувалися їх точні адреси.
Приклад 1. Розрахунок суми елементів масиву.
prog segment
assume cs:prog, ds:prog
data_array dw 10 dup(?)
sum dw ?
start:
mov ax,cs
mov ds,ax
xor ax,ax
mov bx,ax
mov cx,10
next:
add ax,data_array [bx]
add bx,2
loop next
mov sum,ax
ret
prog ends
end start
Проте команда може працювати й з виконавчою(ефективною) адресою:
А вик = (А+[рег]) mod 2^16, де
[рег] - зміст регістра
Спершу ніж виконати команду, ЦП додасть до адреси А (вказаній у команді) поточний зміст регістра - отримає нову адресу й буде працювати з операндом за цією адресою.