Способы передачи параметров.




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).

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: