Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Call mem
3) Розробити програму мовою асемблера, яка обчислює значення виразу y = S (3 + i) i=1
y = S (2 * i) i=1 page 60, 80 TITLE EX_LOOP (EXE) STACKSG SEGMENT PARA STACK 'STACK' DW 128 DUP (?) STACKSG ENDS
DATASG SEGMENT PARA 'DATA' ; --------------------------------------------------------------------------------------------------------- N DW 10 I DW 1; Елементи даних RESULT DW 0 ; --------------------------------------------------------------------------------------------------------- DATASG ENDS CODESG SEGMENT PARA 'Code ' BEGIN PROC FAR ASSUME CS: CODESG, DS: DATASG, SS: STACKSG PUSH DS; Ініціалізація програми SUB AX, AX PUSH AX MOV AX, DATASG MOV DS, AX SUB AX, AX MOV CX, N; Запис до СХ числа циклів BEGIN_LOOP:; Початок циклу MOV AX, I; Пересилання І до регістра АХ MOV BX, 2 MUL BX; Отримання добутку 2*І ADD RESULT, AX; Накопичення суми ряду в змінній RESULT SUB AX, AX INC I; Збільшення І на 1 LOOP BEGIN_LOOP; Кінець опису циклу RET BEGIN ENDP CODESG ENDS END BEGIN Білет 8
1) Описати алфавіт і ідентифікатори мови асемблера. Припустимими символами при написанні тексту програм є: 1. всі латинські букви: A-Z, a-z. При цьому великі і малі літери вважаються еквівалентними; 2. цифри від 0 до 9; 3. знаки?, @, $, _, &; 4. роздільники ,. [ ] () < > { } + / * %! ' "? \ = # ^.
Підпрограма повинна містити мінімум одну команду повернення ret, що повертає управління в точку виклику. Така передача управління здійснюється шляхом витягу зі стеку адреси повернення, що була включена в стек командою call retn явно визначають тип повернення (відповідно з ближньої або дальньої процедури). 3) Розробити програму, яка використовує макрос ініціалізації регістра ds.
init_ds macro ; Макрос настройки ds на сегмент даних mov ax, data mov ds, ax endm out_str macro str ; Макрос виведення рядка на екран. ; На вході - виведений рядок. ; На виході- повідомлення на екрані. push ax mov ah, 09h mov dx, offset str int 21h pop ax endm clear_r macro rg ; очищення регістра rg xor rg, rg endm get_char macro ; введення символу ; введений символ у al mov ah, 1h int 21h endm conv_16_2 macro ; макрос перетворення символу шістнадцятерічної цифри ; у її двійковий еквівалент у al sub al, 30h cmp al, 9h jle $+4 sub al, 7h endm exit macro ; макрос кінця програми mov ax, 4c00h int 21h endm data segment para public 'data' message db 'Введіть дві шістнадцятерічні цифри (букви A, B, C, D, E, F - прописні): $' data ends stk segment stack db 256 dup('? ') stk ends code segment para public 'code' assume cs: code, ds: data, ss: stk main proc init_ds out_str message clear_r ax get_char conv_16_2 mov cl, 4h shl al, cl mov dl, al get_char conv_16_2 add dl, al xchg dl, al; результат у al exit main endp code ends end main Білет 9 1) Охарактеризувати директиви визначення сегментів. Можливі значення атрибута вирівнювання: byte, word, dword, para, page, mempage По замовчуванню приймається para. Атрибут задає кратність початкової адреси логічного сегмента в фізичному. По замовчуванню приймається private Атрибут встановлює можливість і характер об'єднання де-кількох логічних сегментів з одинаковими іменами в один фізичний сегмент (private - об'єднання не задається, public - логічні сегменти об'єднуються шляхом пристикування, common - шляхом накладення зі сторони молодших адрес, stack - шляхом накладення зі сторони старших адрес). Атрибут забезпечує можливість розмежування сегментів великих програм в ОЗП по імені класу, наприклад - всі сегменти з класом 'code' розміщують окремо від всіх сегментів з класом 'data'. Даний атрибут приймається до уваги фактично на рівні фізичних сегментів.
Атрибут вказує транслятору на розрядність зміщень в командах та розрядність даних в поточному логічному сегменті. Фактично даний атрибут визначає біт розрядності D дескриптора сегмента в захищеному режимі. Значення по замовчуванню. Якщо не задана директива визначення процесора то по замовчуванню приймається значення use16. Якщо ж директива визначення процесора задає якийсь із 32-розрядних процесорів, то по замовчуванню приймається значення use32.
3.1 Передача через регістри загального призначення Програма розміщує в регістрах дані для підпрограми, що потім підпрограма ці дані використовує. Такий спосіб часто використовується при виклику стандартних підпрограм і переривань ОС (наприклад, системних функцій MS DOS за допомогою переривання INT 21H: у регістр AH міститься номер функції, DX може застосовуватися для передачі адрес і т.д.). Подібним чином можна також повертати результати з підпрограм. Однак, використовуючи регістри, можна передати невелику кількість даних. Крім того, програмі, що викликає, чи підпрограмі може все одно знадобитися пам'ять для їхнього тимчасового збереження, оскільки регістри потрібні і для інших цілей. Тому регістри доцільно і можна використовувати не завжди. 3.2 Передача через пам'ять У сегменті даних виділяється визначена кількість комірок під загальну пам'ять для програми і підпрограми. Якщо вміст DS в підпрограмі не змінюється, тоді, знаючи ім'я змінної, можна легко одержати до неї доступ. 3.3 Передача через стек Перед викликом підпрограми у стек можна занести необхідні параметри, у тому числі, якщо необхідно, і адреси, а потім організувати доступ до них у підпрограмі. Крім того, у стеку можна зберігати внутрішні локальні змінні п/п. Для правильної роботи програми і п/п потрібно відслідковувати стан стеку і його покажчик SP/ESP. Доступ до параметрів з п/п здійснюється або за допомогою команд POP, або за допомогою звичайних команд звертання до пам'яті (наприклад, MOV) і регістра ВР для адресації. Приклад: а – з АХ, у – з ВХ, c (тип WORD) – з пам’яті
y = S (5 + i) i=1 y = S (2 * i) i=1 page 60, 80 TITLE EX_LOOP (EXE) STACKSG SEGMENT PARA STACK 'STACK' DW 128 DUP (?) STACKSG ENDS
DATASG SEGMENT PARA 'DATA' ; --------------------------------------------------------------------------------------------------------- N DW 10 I DW 1; Елементи даних RESULT DW 0 ; --------------------------------------------------------------------------------------------------------- DATASG ENDS CODESG SEGMENT PARA 'Code ' BEGIN PROC FAR ASSUME CS: CODESG, DS: DATASG, SS: STACKSG PUSH DS; Ініціалізація програми SUB AX, AX PUSH AX MOV AX, DATASG MOV DS, AX SUB AX, AX MOV CX, N; Запис до СХ числа циклів BEGIN_LOOP:; Початок циклу MOV AX, I; Пересилання І до регістра АХ MOV BX, 2 MUL BX; Отримання добутку 2*І ADD RESULT, AX; Накопичення суми ряду в змінній RESULT SUB AX, AX INC I; Збільшення І на 1 LOOP BEGIN_LOOP; Кінець опису циклу RET BEGIN ENDP CODESG ENDS END BEGIN
№ 10 1. Описати спрощені директиви сегментації. Спрощені директиви сегментації створювались для зручності програмування нескладних програм, але в кінцевому підсумку розвиток таких директив привів до їх не меншої складності при значно меншій гнучкості ніж стандартних директив. Тому розглянемо дійсно спрощені варіанти " спрощених" директив, використання яких ще може бути виправдане. Директива MODEL Формат директиви: MODEL Модель пам'яті Обмежемся тільки двома значеннями операнду Модель пам'яті - tiny або small. Директива MODEL використовується як деякий аналог директив GROUP та ASSUME. В випадку tiny всі логічні сегменти програми групуються в один фізичний сегмент. При цьому повинен бути забезпечений одинаковий вміст сегментних регістрів Директива.CODE Позначає початок (або продовження) сегменту кодів. Задає сегмент еквівалентно директиві _Text segment word public 'CODE' Директива.DATA Позначає початок (або продовження) сегменту ініціалізованих даних, тобто початкових даних програми, які повинні розміщуватись в пам'яті під час завантаження.. Директива.DATA? Позначає початок (або продовження) сегменту неініціалізованих даних, тобто даних, які будуть формуватись під час роботи програми, а під час завантаження для них буде лише резервуватись місце в пам'яті.
2. Охарактеризувати опис та ініціалізація масивів у програмах. Масив потрібно моделювати одним із наступних способів:
3. Розробити програму мовою асемблера обчислення значення функції x + 4 якщо x > 2 y = x3 якщо x< 2 x2 – 1 якщо x = 2
page 60, 80 TITLE Програмування розгалужених алгоритмів STACKSG SEGMENT PARA STACK 'STACK' DW 64 DUP (?) STACKSG ENDS DATASG SEGMENT PARA 'DATA' ; ------------------------------------------------------------------------------------ X DW -4; Елементи даних Y DW?; Результат ; ------------------------------------------------------------------------------------- DATASG ENDS CODESG SEGMENT PARA 'Code ' BEGIN PROC FAR ASSUME CS: CODESG, DS: DATASG, SS: STACKSG PUSH DS; Ініціалізація програми SUB AX, AX PUSH AX MOV AX, DATASG MOV DS, AX SUB AX, AX; Очищення регістра АХ MOV DX, X; Пересилання Х до регістра DX CMP DX, 0; Порівняння Х та 0 JL LBL1; Перехід, якщо менше JG LBL2; Перехід, якщо більше MOV AX, X; Обчислення за умовою X = 0 ADD AX, 1; AX = x+1 JMP EXIT; Перехід на вихід з програми LBL1:; Обчислення за умовою X < 0 MOV AX, X MOV BX, X MUL BX ADD AX, 5 MUL BX; AX = 5+x^2 JMP EXIT; Перехід на вихід з програми LBL2:; Обчислення за умовою X > 0 MOV AX, X MOV BX, X MUL BX MUL BX SUB AX, 2 DIV BX; AX = x^3-2 EXIT:; Закінчення роботи програми MOV Y, AX; Результат RET BEGIN ENDP CODESG ENDS END BEGIN
№ 11 1. Охарактеризувати директиви визначення даних.
|