Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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 можна об'єднати з файлом, де ці процедури використовуються.

  1. Розробити програму мовою асемблера, яка обчислює значення виразу

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-х операндних команд.