Студопедия

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

Разделы сайта

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






Call mem







Наведемо приклади різних модифікацій команди CALL з поясненнями.
Приклади:

 

call Show ; виклик процедури Show (розміщена в поточному сегменті кодів)
call F1 ; виклик процедури F1 (розміщена в іншому сегменті)
call far ptr F2 ; far виклик процедури F2 (в іншому або поточному сегменті)
call bx ; виклик процедури поточного сегмента кодів, відносна адреса якої визначається вмістом bx
call Addr1 ; виклик процедури, адреса якої (повна чи відносна) розміщена в пам’яті за адресою Addr1, відстань визначається типом Addr1
call word ptr Addr2 ; виклик ближньої процедури, відносна адреса якої розміщена в пам’яті за адресою Addr2
call Table[si] ; виклик процедури, адреса якої (повна чи відносна) розміщена в масиві адрес Table; відстань визначається типом Table


Команда CALL, як і команда JMP, здійснює перехід у визначену точку програми, має важливу відмінність в механізмі його реалізації. Відмінність CALL від команд IMP – збереження адреси повернення в стеку і повернення за командою RET. При виконанні виклику процесор поміщає в стек програми адресу повернення (вміст IP/EIP чи CS: IP/EIP, тобто адресу наступної за CALL команди), а на її місце в IP/EIP (чи в CS: IP/EIP) заносить відносну (чи повну) адресу підпрограми. У випадку NEAR виклику процесор працює з IP/EIP, у випадку FAR виклику – з CS: IP/EIP. Як результат, вказівник стека зміщується на одне/два слова, а процесор переходить на виконання підпрограми.

 

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. роздільники ,. [ ] () < > { } + / * %! ' "? \ = # ^.

  • ідентифікатори - послідовності припустимих символів, програми, що використовуються для позначення таких об'єктів, як коди операцій, імена змінних і назви міток. Правило запису ідентифікаторів полягає у наступному: ідентифікатор може складатися з одного або декількох символів. Як символи можна використовувати букви латинського алфавіту, цифри і деякі спеціальні знаки - _,?, $, @. Ідентифікатор не може починатися символом цифри. Довжина ідентифікатора може бути до 255 символів, хоча транслятор сприймає лише перші 32, а інші ігнорує. Регулювати довжину можливих ідентифікаторів можна з використанням опції командного рядка mv. Крім цього існує можливість указати транслятору на те, щоб він розрізняв прописні й малі літери або ігнорував їх розходження (що й робиться за замовчуванням). Для цього застосовуються опції командного рядка /mu, /ml, /mx;


2) Описати команду повернення із процедури.

Підпрограма повинна містити мінімум одну команду повернення ret, що повертає управління в точку виклику. Така передача управління здійснюється шляхом витягу зі стеку адреси повернення, що була включена в стек командою call
Якщо використовується команда ret, то тип повернення визначається моделлю пам'яті чи типом підпрограми. Модифікації команди

retn
retf

явно визначають тип повернення (відповідно з ближньої або дальньої процедури).
Ці команди корисні у випадку, якщо через стек в процедуру передаються параметри. Перед викликом процедури ці параметри записуються в стек, а далі туди записуються адреса повернення. При поверненні необхідно скорегувати вказівник стеку SP/ESP таким чином, щоб виключити параметри, що залишилися в стеку.

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, public, common, stack

По замовчуванню приймається private

Атрибут встановлює можливість і характер об'єднання де-кількох логічних сегментів з одинаковими іменами в один фізичний сегмент (private - об'єднання не задається, public - логічні сегменти об'єднуються шляхом пристикування, common - шляхом накладення зі сторони молодших адрес, stack - шляхом накладення зі сторони старших адрес).
Атрибут класу сегмента - довільний ідентифікатор в лапках.

Атрибут забезпечує можливість розмежування сегментів великих програм в ОЗП по імені класу, наприклад - всі сегменти з класом 'code' розміщують окремо від всіх сегментів з класом 'data'. Даний атрибут приймається до уваги фактично на рівні фізичних сегментів.


Можливі значення атрибуту розрядності: use16 або use32

Атрибут вказує транслятору на розрядність зміщень в командах та розрядність даних в поточному логічному сегменті. Фактично даний атрибут визначає біт розрядності D дескриптора сегмента в захищеному режимі.

Значення по замовчуванню. Якщо не задана директива визначення процесора то по замовчуванню приймається значення use16. Якщо ж директива визначення процесора задає якийсь із 32-розрядних процесорів, то по замовчуванню приймається значення use32.


2) Охарактеризувати передачу параметрів підпрограмам.


У мові Асемблера немає встановлених правил передачі параметрів підпрограмам (процедурам). Параметри можна передавати різними способами:
• через регістри;
• через розподілювальну пам'ять;
• через стек.

3.1 Передача через регістри загального призначення

Програма розміщує в регістрах дані для підпрограми, що потім підпрограма ці дані використовує. Такий спосіб часто використовується при виклику стандартних підпрограм і переривань ОС (наприклад, системних функцій MS DOS за допомогою переривання INT 21H: у регістр AH міститься номер функції, DX може застосовуватися для передачі адрес і т.д.). Подібним чином можна також повертати результати з підпрограм.

Однак, використовуючи регістри, можна передати невелику кількість даних. Крім того, програмі, що викликає, чи підпрограмі може все одно знадобитися пам'ять для їхнього тимчасового збереження, оскільки регістри потрібні і для інших цілей. Тому регістри доцільно і можна використовувати не завжди.

3.2 Передача через пам'ять

У сегменті даних виділяється визначена кількість комірок під загальну пам'ять для програми і підпрограми. Якщо вміст DS в підпрограмі не змінюється, тоді, знаючи ім'я змінної, можна легко одержати до неї доступ.

3.3 Передача через стек

Перед викликом підпрограми у стек можна занести необхідні параметри, у тому числі, якщо необхідно, і адреси, а потім організувати доступ до них у підпрограмі. Крім того, у стеку можна зберігати внутрішні локальні змінні п/п. Для правильної роботи програми і п/п потрібно відслідковувати стан стеку і його покажчик SP/ESP. Доступ до параметрів з п/п здійснюється або за допомогою команд POP, або за допомогою звичайних команд звертання до пам'яті (наприклад, MOV) і регістра ВР для адресації.

Приклад:
Програма перед викликом п/п MY_ PROC записує у стек такі параметри:

а – з АХ, у – з ВХ, c (тип WORD) – з пам’яті


Для доступу до параметрів у стеку використовується ВР (разом з SS). В ньому формується зміщення необхідного елемента відносно початку стеку. Перед використанням ВР необхідно правильно ініціювати:
3) Розробити програму організації циклів у програмах асемблера

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. Охарактеризувати опис та ініціалізація масивів у програмах.

Масив потрібно моделювати одним із наступних способів:
1. Використовуючи перерахування елементів масиву в полі операндів однієї з директив опису даних. При перерахуванні елементи розділяються комами.
Наприклад:
mas dd 1, 2, 3, 4, 5
2. Використовуючи оператор повторення DUP
Наприклад:
mas dw 5 dup (0
3. За допомогою директив label i rept. Директива rept викликає повторення вказане число разів рядків, що знаходяться між директивою і рядком endm.
4. За допомогою використання циклу для ініціалізації значеннями області пам*яті, яку можна буде трактувати як масив.

 

3. Розробити програму мовою асемблера обчислення значення функції

x + 4 якщо x > 2

y = x3 якщо x< 2

x2 – 1 якщо x = 2

 

  x + 1 якщо x = 0 y = 5 + x2 якщо x< 0 x3-2 якщо x > 0  

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. Охарактеризувати директиви визначення даних.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.