1). Передача параметров через РОН.
Достоинства: быстрый и удобный;
Недостатки: ограничен в размерах (не более 5).
Применение: написание операционных систем (печать строки. и др.).
2). Передача через общую область памяти. (общие переменные)
Общие переменные описываются следующим образом,
в вызывающей:
PUBLIC список имен (имена переменных или меток).
В вызываемой процедуре:
EXTERN {имя параметра, тип}
Пример:
;головная программа
DATA Segment
EXTERN A:WORD, R:WORD
DATA ENDS
CODE Segment PUBLIC
ASSUME DS:DATA,CS:CODE
PUBLIC PUB_PROC FAR
start:
mov AX, DATA
mov DS, AX
CALL far ptr pub_proc
mov cx, ds:A
sub cx, 2
add cx, ds:R
mov ds:A,cx
ret
CODE ENDP
END start
;Модуль, задающий общие переменные и процедура.
DATA Segment
PUBLIC A, R
A DW 10
B DW 5
C DW 3
B DW 1
DATA ENDS
CODE Segment PUBLIC
ASSUME DS:DATA,CS:CODE
Public Pub_Proc
Pub_Proc Proc Far
mov AX, B
add AX, C
mov R, AX
ret
Pub_Proc ENDP
CODE ENDS
END
3). Передача параметров через стек.
Такой метод применим не только между ассемблерными модулями, но и с разными языками. STDCALL- стандартная взаимосвязь процедур по параметрам. Основным средством доступа к параметрам является BP, для которого:
- его значение при запуске процедуры сохраняется в стеке;
- доступ к параметрам осуществляется с помощью базовой адресации
Структура стека на момент начала работы с параметрами вызванной процедуры:
(Этот вариант используется в языке С.)
BP | ß SPàBP |
CS:IP | ß (BP)+2 |
Par1 | ß (BP)+4/6 |
Par2 | ß (BP)+6/8 |
……… | |
ParN | ß (BP)+(N+4)/(N+6) |
Стек |
Вариант для Pascal такой же, за исключением порядка параметров.
Пример:
;main
CODE Segment
EXTERN ADD3UP
Push AX
Push BX
Push CX
CALL ADD3UP
ADD SP,6
CODE ENDS
END start
;процедура обработки
ADD3UP Proc NEAR
Public ADD3UP
Push BP
mov BP, SP
mov AX, [BP+4]
add AX, [BP+6]
add AX, [BP+8]
pop BP
ret
ADD3UP ENDP
4). Передача параметров через поток кода.
Передаваемые параметры размещаются непосредственно в коде программы, сразу за вызывающей командой.
Пример:
Call Print_It
db ‘печатная строка’
;продолжение программы.
Плюсы: возможность использования любого числа параметров;
Недостатки: доступ косвенный, следовательно медленный.
5). Передача параметров результата.
Передача параметров результатов может быть реализована через стек, AX (BYTE, WORD), DX:AX (DWORD), ST(0)- вершина стека x87 (FLOAT).
Режим адресации в памяти и микропроцессоре Intel 86.
Режимом или способом адресации называют процедуру нахождения операндов.
Операнды в программе могут задаваться в:
1) РОНах
2) Непосредственно в коде программы
3) Ячейках памяти (прямо или косвенно)
4) В портах ввода/вывода
Режим адресации | Обозначение в ассемблере | Регистр. сегмент. по умолчанию | Пример использования |
регистровый | AX/AL (16/8) | ----- | Mov AX,CX; Mov AL,BH |
Непосредственная адресация | Const (16/8) | ----- | Mov AX,100H; Mov BL,-24H |
Прямая адресация | Метка, задающая смещение относительно данных. | DS | Mov Ax,TAB (обычно используется для задания статических переменных) |
Косвенная адресация | [BX], [BP] [DI], [SI] (>i386 можно исп. все регистры) | DS, SS DS (ES), SS | Mov AL,[DI] Mov AX, ES:[BX] |
Базовая адресация | [BX]+смещение [BP]+ смещение | DS ES | Mov AX, 4[BP] (означает 4+BP) Mov CX, [BP]+2 Mov AX, CS:[BX]+4 |
Индексная адресация | [SI]+смещение [Di]+ смщение | DS DS (ES) | Mov AL,B, TAB (исп. для строк или массивов) |
Базово – индексная адресация | [BX]:[DI]+смещение [BX]:[SI]+смещение [BX]:[BP]+смещение | DS, SS DS, SS | Mov AX,ES:VALUE [BX]:[DI] (VALUE+BX+DI) |
Базово – индексная с масштабированием (начиная с i386) | [EAX][ESX*m]+смещение m=1, 2, 4, 8 | Mov Ax,4*[BP] Mov CX,[BP]*2+2 |
1) Операнды могут располагаться в любых РОНах и сегментных регистрах. В тексте программы указывается название соответствующего регистра.
2) Все арифметические команды (кроме деления) позволяют указывать один из операндов непосредственно в тексте программы.
3) Если известен адрес операнда в памяти, можно использовать этот адрес. Прямая адресация иногда называется адресацией по смещению (Mov AX,ES:2CH – из ячейки с адресом 2СН сегмента EXTRA содержимое пересылается в AX).
4) Адрес операнда в памяти можно хранить в любом из указанных регистрах ([BX]:[BP]; [DI]:[SI]). После i386 в любых регистрах.
Mov AX,ES:[DI] – из регистра [DI] выбирается адрес операнда, ищем его в сегменте EXTRA и пересылаем в AX.
5) Базовую адресацию используем, когда в регистре находится адрес начала структуры данных (вектора, строки и т.д.), а доступ надо осуществить к какому либо элементу этой структуры (Mov AX,4[BP] – содержимое является адресом операнда в AX). Другое применение – это доступ из подпрограмм к параметрам, переданных в STACK.
6) Для нахождения элементов массива
7) Для двумерных массивов и массивов записи
8) Расширенный режим (используется в процессорах выше i386).