Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
POP прийомник
Поміщає в прийомник слово або подвійне слово, яке знаходиться на вершині стеку, збільшуючи ESP на 2 або 4 відповідно. РОР виконує дію, яка повністю протилежна PUSH. Прийомником може бути регістр загального призначення, сегментний регістр крім CS (щоб завантажити CS зі стеку, слід скористатися командою RET), або змінна. Якщо в ролі прийомника виступає операнд, який використовує ESP для непрямої адресації, команда РОР вираховує адресу операнда уже після того, як вона збільшила ESP. 2. Визначити опис процедури при багатомодульному програмуванні. Опис процедури
Процедура представляє собою групу команд для рішення конкретної підзадачі і має засоби для отримання керування із точки виклику задачі більш високого рівня і повернення керування в цю точку. Для опису процедури використовуються директиви PROC i ENDP.
Синтаксис опису процедури:
ім'я_процедури PROC [модифікатор_мови] мова] [відстань]
команди Тіло директиви мови асемблера процедури
ім'я_процедури ENDP
Параметр [відстань] може набувати значення near або far і характеризує можливість звертання до процедури з іншого сегмента коду. Процедура може розміщуватися в будь-якому місці програми, але так щоб на неї не попало керування. 3. Розробити програму, яка використовує макрос, що реалізує операції розгалуження. x + 2 якщо x < 0 y = x2 + 1 якщо x= 0 x2 якщо x > 0 (зразок) m asm model small .486 .stack 100h
func3 macro; макрос, що виконує (2x) mov ax, x mov bx, 2 mul bx endm func2 macro; макрос, що виконує (x+5) mov ax, x add ax, 5 endm func1 macro; макрос, що виконує (x^3) mov ax, x mul ax mul ax endm
.data; сегмент даних x dw 2; оголошення х
.code begin: MOV AX, @data MOV DS, AX xor AX, AX
mov dx, x cmp dx, 0
jl M1; перехід на M1 якщо х менше 0 jg M2; перехід на M2 якщо х більше 0
func1; якщо х дорівнює 0 M1: func3 jmp exit; перехід на мітку exit
M2: func2 jmp exit; перехід на мітку exit exit: mov ax, 4c00h; стандартне завершення програми int 21h end begin
№ 15 1. Описати команду інвертування знаку числа. neg операнд Команда виконує одну дію:
операнд = 0 - операнд Команду neg можна використовувати для: 1. зміни знаку; 2. виконання відніманні із константи. Команди sub і sbb не дозволяють відняти значення із константи, тому що константа не можу служити операндом-приймачем у цих операціях.
neg ax; зміна знаку (ax) add ax, 340; фактично віднімання
2. Охарактеризувати варіанти розташування процедур у програмах. Варіанти розташування процедур в програмі.
1.На початку програми.
Процедура буде розміщена до мітки, з якої починається виконання програми. Ця мітка має бути вказана як параметр директиви END, що означає кінець програми:
MODEL Small STACK 100h .data .code my_proc proc near ...... ret my_proc endp start: ....... end start 2.В кінці програми.
Процедура буде розміщена після команди, яка повертає керування операційній системі.
MODEL Small STACK 100h .data .code start: ....... mov ax, 4C00h; повернення керування операційній системі int 21h my_proc proc near ...... ret my_proc endp end start
3.Проміжний варіант.
Процедура розташована всередині іншої процедури або основної програми. В цьому випадку необхідно передбачити обхід тіла процедури за допомогою команди безумовного переходу JMP:
MODEL Small STACK 100h .data .code start: ....... jmp m1 my_proc proc near ...... ret my_proc endp m1: mov ax, 4C00h; повернення керування операційній системі int 21h end start
4.В окремому сегменті коду.
Часто використовувані процедури виносяться в окремий файл, який має бути трансльований для отримання об'єктного коду. Об'єктний файл утилітою TLINK можна об'єднати з файлом, де ці процедури використовуються.
y = S (і+ 3) 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 6 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, 3 ADD BX; Отримання суми 2+І ADD RESULT, AX; Накопичення суми ряду в змінній RESULT SUB AX, AX INC I; Збільшення І на 1 LOOP BEGIN_LOOP; Кінець опису циклу RET BEGIN ENDP CODESG ENDS END BEGIN №16
1.Визначити адресацію даних Спосіб визначеня в команді ефективної адреси аперанда називають способом або режимом адресації. Розрізняють такі способи адресації даних: 1.Безпосередня адресація 2. Регістрова адресація 3.Групи способів адресації даних у пам'яті.
2. Описати виклик процедури при використанні модулів.
Для виклику процедур використовується команда call. Синтаксис команди:
call [модифікатор] ім’я_процедури
Команда call передає керування за адресою з символічним іменем ім’я_процедури, але при цьому в стеку зберігається адреса повернення – адреса команди, наступної за командою call. Параметр [ модифікатор ] може набувати таких значень:
- near ptr – прямий перехід на мітку всередині поточного сегмента коду; - far ptr – прямий перехід на мітку в іншому сегменті коду; - word ptr – побічний перехід на мітку всередині поточного сегмента коду; - dword ptr – побічний перехід на мітку в іншому сегменті коду.
Для повернення керування викликаючій програмі використовується команда ret. Її синтаксис:
ret [число]
Команда ret зчитує адресу повернення із стека і передає її в регістри cs i ip/eip, тим самим повертаючи керування на команду, наступну в програмі за командою call. Параметр [ число ] визначає кількість елементів, що видаляються із стека при поверненні з процедури.
Виклик процедури командою call може бути:
1.Внутрішньосегментним – процедура знаходиться в поточному сегменті коду (має тип near) і в якості адреси повернення команда call зберігає лише вміст регістра ip/eip, що достатньо для повернення. 2.Міжсегментним – процедура знаходиться в іншому сегменті коду (має тип far) і для здійснення повернення команда call має запам’ятати вміст регістрів cs i ip/eip.
3. Розробити програму мовою асемблера, яка обчислює значення виразу y = P (i +2) i=1 page 60, 80 TITLE EX_LOOP (EXE) STACKSG SEGMENT PARA STACK 'STACK' DW 32 DUP(?) STACKSG ENDS DATASG SEGMENT PARA 'DATA' ; ------------------------------------------------------------------------------------------------------------ N DW 10 I DW 1; Елементи даних P DW 2 ; ------------------------------------------------------------------------------------------------------------ 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, P; Пересилання добутку Р до рег. АХ MOV BX, I; Пересилання І до рег. ВХ MUL BX; Отримання добутку Р = Р * І INC I; Збільшення І на 1 MOV P, AX; Накопичення добутку в змінній Р SUB AX, AX; Очищення рег. АХ LOOP BEGIN_LOOP; Кінець опису цикла
RET BEGIN ENDP CODESG ENDS END BEGIN
№ 17
1. Охарактеризувати безпосередню адресацію даних. У випадку безпосередньої адресації дані є частиною команди. При цьому операнд константною розмірністю 1, 2, 4 байти. Змінити це значення під час виконання команди не можна. Такі команди виконуються швидко. Вони використовуються для ініціалізації регістрів в операціях порівняння тощо. Цей спосіб передбачений для більшості 2-х операндних команд.
|