а отримати за допомогою конструкції [ВХ]. p align="justify"> Частковий основної програми, відповідний зверненнями D (A) і D (B):
; процедура; основна программаDPROCLEABX, A; ВХ = адресу АPUSH СХ; зберегти cxCALLDD (A) MOV CL, 4LEABX, B; ВХ = адресу ВSHR WORD PTR [BX], CL X : = x div 16CALLD; D (B) POP CX; відновити СХRETDENDP
Зауваження . На початку своєї роботи процедура повинна зберегти в стеку значення тих регістрів, які їй будуть потрібні для роботи. Перед виходом вона повинна відновити колишні значення цих регістрів, зчитавши їх з стека.
У разі, коли параметром процедури є дані складних типів, вони також передаються в процедуру по посиланню з використанням одного з регістрів-модифікаторів і непрямої адресації.
. Передача через стек: програма перед викликом заносить параметри в стек за допомогою команди push. Щоб підпрограма могла змінювати значення параметрів, слід передавати їй не самі значення, а адреси параметрів. Використовується у випадку великої кількості параметрів.
Виконання процедури повинно починатися зі наступних команд (В«вхідніВ» дії процедури):
Р PROCUSH ВР; зберегти ВРBP, SP; ВР - на вершину стека
...
команди процедури
Після запису в стек старого значення ВР (ВРст) для доступу до параметрів процедури треба використовувати вираз виду [ВР + i], де i = 2 * n (n - розмірність параметра).
При виході з процедури стек повинен бути в тому ж стані, в якому він був після В«вхіднихВ» дій. Для відновлення стану стека виконуються В«вихідніВ» дії:
POP ВР; відновити старе значення ВР2 * k; очищення стека від k параметрів-слів і повернення
Р ENDP
За командою RET i * k з стека видаляється адресу повернення, потім стек очищається на вказане операндом число байтів і далі виконується перехід за адресою повернення.
Модульна структура програм мовою Асемблера.
Модулем називають частину програми, вирішальну деяку підзадачі і більш-менш незалежну від інших частин. Окремим випадком модулів є процедури. p align="justify"> Розглянемо процес об'єднання окремих модулів (оформлених у вигляді окремих asm-файлів) в єдиний завантажувальний модуль.
Нехай в програмі є два модулі Ml і М2. Нехай в модулі М2 описана процедура Р, до якої звертатиметься модуль Ml, і нехай модуль М2 користується змінної Х і константою До з модуля Ml. Щоб при трансляції не виникло повідомлення про помилку "неописане ім'яВ», транслятору асемблера повідомляється, що імена Х і К, хоча і використовуються в М2, описані в іншому модулі. Таке повідомлення робиться за допомогою директиви
<ім'я>: <тип>, ..., <ім'я>: <тип>
де <тип> - це BYTE, WORD, DWORD, ABS, NEAR, FAR.
У нашому випадку в модулі М2 треба вказати директиву EXTRN X: BYTE, K: ABS. Вона повідомляє ассемблеру, що імена Х і К є зовнішніми по відношенню до даного модулю. У модулі Ml слід помістити директиву EXTRN Р: PAR, сообщающую, що Р - це процедура з іншого модуля і виклик її повинен бути далеким. У модулі, де описані імена К і Х (тобто в Ml) треба помістити директиву PUBLIC <ім'я>, ...., <ім'я>
В даному випадку в модулі Ml треба записати директиву PUBLIC X, K. Цією директивою повідомляється, що імена Х і К даного модуля дозволено використовувати в інших модулях. Імена, описані в модулі і доступні іншим модулям, по відношенню до цього модуля називаються загальними. Отже, якщо в якомусь модулі програми деяке ім'я описано як зовнішнє, то в якомусь іншому модулі це ім'я обов'язково має бути оголошено загальним. З урахуванням сказаного модулі Ml і М2 повинні мати наступний вигляд
; модуль Ml; модуль М2EXTRN Р: FAREXTRN X: BYTE, K: ABSPUBLIC Х, KPUBLIC PXDB? PPROCFARКEQU100MOVX, 0 ... MOVАХ, КCALLР ...
Модулі транслюються окремо. Потім при компонуванні вони об'єднуються в єдину машинну програму за допомогою команди:
LINK M1.OBJ + ... + Mk.OBJ, M.EXE;
Робота з командою переривань INT.
Особливим видом є підпрограми, що викликаються з переривання командою INT. Переривання бувають двох видів:
Гј апаратні - це сигнал від будь-якого пристрою системи для процесора, який за цим сигнало...