Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LABA07_2012.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
154.62 Кб
Скачать

Використання спільних даних

Наявність спільних даних уможливлює обробку в одному асемблерному модулі даних, що є визначеними в іншому асемблерному модулі.

Для того, щоби змінні PRICE та QTY визначались в основній програмі, але завантаження значень з цих областей пам’яті в регістри BX та AX виконувалась в підпрограмі, необхідно виконати такі зміни в програмах з попереднього пункту:

  • в основній програмі ідентифікатори PRICE та QTY визначені як PUBLIC. Сегмент даних так само визначений як PUBLIC;

  • в підпрограмі ідентифікатори PRICE та QTY визначені як EXTRN та WORD. Таке визначення вказує асемблеру на довжину цих полів в 2 байт.

*Примітка:

Основна програма та підпрограма можуть визначати будь-які інші елементи даних, але спільними елементами будуть лише ті, що мають атрибути PUBLIC та EXTRN.

При компонуванні двох і більше асемблерних модулів необхідно визначити стек достатньо великого розміру – на практиці для великих програм визначення розміру в 64 слова є достатнім.

TITLE CALLMULL ;Головна програма

EXTRN SUBMUL:FAR

PUBLIC QTY,PRICE

STACKSG SEGMENT PARA STACK 'Stack'

DW 64 DUP(?)

STACKSG ENDS

DATASG SEGMENT PARA PUBLIC 'Data'

QTY DW 0140H

PRICE DW 2500H

DATASG ENDS

CODESG SEGMENT PARA PUBLIC 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG,SS:STACKSG

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATASG

MOV DS,AX

CALL SUBMUL ;Викликати підпрограму

RET

BEGIN ENDP

CODESG ENDS

END BEGIN

ТITLE SUBMUL ;Підпрограма множення

CODESG SEGMENT PARA PUBLIC 'CODE'

SUBMUL PROC FAR

ASSUME CS:CODESG

PUBLIC SUBMUL

MOV AX,PRICE

MOV BX,QTY

MUL BX

RET

SUBMUL ENDP

CODESG ENDS

END SUBMUL

Передача параметрів через стек

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

Програма, приведена далі, перш ніж викликати підпрограму SUBMUL заносить у стек значення з полів PRICE і QTY. Після команди CALL стек виглядає в так:

... │ 1600 │ D213 │ 4001 │ 0025 │ 0000 │ C213 │

6 5 4 3 2 1

  1. Ініціалізуюча команда PUSH DS заносить адресу сегменту даних у стек. Ця адреса може відрізнятися в різних версіях DOS.

  2. Команда PUSH AX заносить у стек нуль.

  3. Команда PUSH PRICE заносить у стек слово даних (2500).

  4. Команда PUSH QTY заносить у стек друге слово даних (0140).

  5. Команда CALL заносить у стек вміст регістра CS (D213)

  6. Оскільки що команда CALL представляє тут міжсегментний виклик, то в стек заноситься також вміст регістра IP(1600).

Програма, що викликається використовує регістр BP для доступу до параметрів у стеку, але вона, також, запам'ятовує вміст регістра BP, записуючи його в стек. У даному випадку, припустимо, що регістр BP містить нуль, тоді цей нуль (два байти) буде записано у вершині стеку (ліворуч). Потім програма поміщає в регістр BP вміст із регістра SP, оскільки у якості індексного регістра може використовуватися регістр BP, але не SP. Команда завантажує в регістр BP значення 0072. Спочатку регістр SP містив розмір порожнього стека, тобто комірки 80. Запис кожного слова в стек зменшує вміст SP на 2:

BPIPCSQTYPRICEAXDS

0000 │ 1600 │ D213 │ 4001 │ 0025 │ 0000 │C213 │

│ │ │ │ │ │ │

SP: 72 74 76 78 7A 7C 7E

Оскільки BP тепер також містить 0072, то параметр ціни (PRICE) буде за адресою BP+8, а параметр кількості (QTY) - за адресою BP+6. Програма пересилає ці величини зі стеку в регістри AX і BX відповідно, і виконує множення.

Перед поверненням у вихідну програму в регістрі BP відновлюється початкове значення, а вміст у регістрі SP збільшується на 2, з 72 до 74.

Остання команда RET являє собою міжсегментне повернення (“довгий” перехід) у вихідну програму. По цій команді виконуються наступні дії:

  • З вершини стека відновлюється значення регістра IP (1600).

  • Вміст регістра SP збільшується на 2, від 74 до 76.

  • З нової вершини стеку відновлюється значення регістра CS (D213).

  • Вміст регістра SP збільшується на 2 від 76 до 78.

У такий спосіб здійснюється коректне повернення у викликаючу програму. Залишилося одне невелике пояснення. Команда RET закодована як RET 4. Параметр 4 являє собою кількість байт у стеку, використаних при передачі параметрів (два слова в даному випадку). Команда RET додасть цей параметр до вмісту регістра SP, одержавши значення 7C. Таким чином, зі стеку вилучаються непотрібні більше параметри. Будьте особливо уважні при відновленні регістра SP - помилки можуть привести до непередбачуваного результату.

TITLE CALLMULL ;Головна програма

EXTRN SUBMUL:FAR

STACKSG SEGMENT PARA STACK 'Stack'

DW 64 DUP(?)

STACKSG ENDS

DATASG SEGMENT PARA 'Data'

QTY DW 0140H

PRICE DW 2500H

DATASG ENDS

CODESG SEGMENT PARA PUBLIC 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG,SS:STACKSG

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATASG

MOV DS,AX

PUSH PRICE

PUSH QTY

CALL SUBMUL ;Викликати підпрограму

RET

BEGIN ENDP

CODESG ENDS

END BEGIN

ТITLE SUBMUL ;Підпрограма множення

CODESG SEGMENT PARA PUBLIC 'CODE'

SUBMUL PROC FAR

ASSUME CS:CODESG

PUBLIC SUBMUL

PUSH BP

MOV BP,SP

MOV AX,[BP+8] ;Вартість

MOV BX,[BP+6] ;Кількість

MUL BX ;Добуток в DX:AX

POP BP

RET

SUBMUL ENDP

CODESG ENDS

END SUBMUL

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]