- •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
- •Хід роботи:
- •Контрольні питання:
2.2. Адресні змінні
Тепер уточнимо, як асемблер обробляє опис змінних, як початкові значення яких зазначені адресні вираження. Такі змінні описуються за допомогою директив DW і DD. У нашому прикладі як початкове значення змінних В1 і В2 зазначене ім'я змінної А2, тобто адреса цієї змінної. Але яка адреса - абсолютна або відносна тут мається на увазі? Правила тут такі: якщо або змінної або мітки (або адресне вираження, що містить таке ім'я або мітку) зазначено як операнд директиви DW, те асемблер заміняє ім'я на його зсув, але якщо ім'я зазначене в директиві DD, тоді асемблер заміняє його на адресну пару, що складається з номера сегмента, де описане це ім'я, і зі зсуву імені усередині даного сегмента (ця адресна пара визначає абсолютну адресу імені):
Bl dw а2 еквівалентно Bl dw offset а2 в2 dd а2 еквівалентно в2 dd вод а2 : offset a2
Таким чином, хоча в директиві DD ми вказуємо тільки ім'я й не вказуємо ніякого сегмента, асемблер сам визначає цей сегмент і приєднує його до зсуву. При цьому, у силу "переверненого" подання подвійних слів у пам'яті ПК, частина seg цієї пари виявляється в другому слові даного подвійного слова, а частина offset - у першому слові (В2: offset, B2+2: seg).
Відзначимо також, що в директиві DD як операнд можна вказати адресну пару наступного виду:
<ім'я сегмента>:<адресне вираження> Наприклад:
DD А:В2
У цьому випадку асемблер заміняє ім'я сегмента на його номер, а от ім'я змінної заміняє на його зсув, але відлічене не від початку того сегмента, де воно описано, а від початку зазначеного сегмента. Наприклад, у нашій директиві ім'я А буде замінене на l000h, а ім'я В2 - на 412h, тому що абсолютна адреса змінної В дорівнює 10412h, а абсолютна адреса початку сегмента А дорівнює l0000h: 10412h-10000h=412h. І хоча подібні операнди припустимі, ними треба користуватися обережно, тому що відстань від початку сегмента А до змінної В2 з іншого сегмента може бути занадто більшим і перевершити максимально припустиму величину (64 Кб) для зсувів. Крім того при трансляції програми можлива перестановка її сегментів, і може трапитися так, що сегмент А виявиться розташованим у пам'яті після сегмента В, де описана змінна В2, і тоді зсув вийде негативним, що, звичайно, неприпустимо.
Індивідуальні завдання:
Скласти повну програму на мові Асемблера.
1 f=(2x +3y)/4z+5x; 2 f=(8x +9y)/(3z+1); 3 f=(18x+9y-5)/3z+2; 4 f=(4y+2)/(7-4z)+x; 5 f=z/(7y-x)(3-6x); 6 f=x+y+3z/5-4; 7 f=(5z-4x)/(y-8); 8 f=(x+7)/(zy-1); 9 f=(y-7x-2z)/(6y+1); 10 f=(5-z)/(x-3y); 11 f=(77y-8)/(x+6); 12 f=(6z-4y)/(3x-8); |
13 f=(12z-5y)/(3x+2)-5z; 14 f=(4x+5y-12z)/(2z-5); 15 f=(3x-2y+1)/(10z-1); 16 f=(5z-4x)/(y+2x); 17 f=(5x+7)/(zy+1); 18 f=(y+7x-2z)/(y+1); 19 f=(5+3z)/(x+3y-1); 20 f=(2x+3y-z)/(4z+5x); 21 f=(8x+2y+z)/(3z+2); 22 f=(18x+9y)/(3z+x+2); 23 f=(4y+2)/(7-4z)+x; 24 f=z(7y-x)/(3-6x)-1;
|
