Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


–аспределение пам€ти под локальные данные




ѕодпрограммы на ассемблере, вызываемые из Borland Pascal, могут выдел€ть пам€ть дл€ собственных переменных - как посто€нных, которые используютс€ в нескольких подпрограммах, так и временных, которые создаютс€ только в какой-то одной процедуре.

19.4.1. –аспределение пам€ти дл€ посто€нных локальных переменных

Borland Pascal позвол€ет ассемблерным программам резервировать пространство дл€ данных в сегменте глобальных данных (DATA или DSEG). ¬ тексте ассемблерной программы такое выделение данных происходит с помощью директив типа DB, DW и т. п.), например:

DATA SEGMENT PUBLIC AInt DW? AByte DB?

DATA ENDS

ѕеременные, размещенные в глобальном сегменте данных, имеют два важных ограничени€. ѕервое из этих ограничений заключаетс€ в том, что такие переменные €вл€ютс€ внутренними (private) по отношению к ассемблерному модулю, поэтому из модул€ Borland Pascal они недоступны (однако в Pascal-программу можно передать

указатель на эти данные). ¬торое ограничение Ч эти переменные нельз€ инициализировать при объ€влении. Ќапример, оператор

AInt DW 42h

не будет порождать ошибки при трансл€ции и компоновке, однако во врем€ работы программы заначение AInt при первом обращении будет неопределенным.

Ёти ограничени€ можно обойти, примен€€ типизированные константы Borland Pascal с последующим их объ€влением в ассемблерном модуле директивой EXTRN.

19.4.2. –аспределение пам€ти дл€ временных локальных переменных

 ажда€ ассемблерна€ процедура может размещать в стеке собственные локальные переменные, которые должны уничтожатьс€ после передачи управлени€ вызывающей процедуре.

¬ следующем примере процедура AsmProc резервирует место дл€ двух перемен-н-ых целого типа а и №:

CODE SEGMENT

ASSUME cs:CODE AsmProc PROC FAR,'procedure AsmProc(i:integer);

PUBLIC AsmProc

LOCAL a:word, b:word == LocalSpace; а находитс€ по адресу [bp-2],

; b - [bp-4] i EQU WORD PTR [BP+6]

push bp

mov bp.sp

sub sp, LocalSpace.Хуменьшение SP дл€ размещени€ локальных переменных

mov ax,42

mov a,ax

xor ax,ax

mov b,ax.Хинициализаци€ локальных переменных

mov sp.bp

pop bp

ret 2 AsmProc ENDP CODE ENDS

END

ќператор

LOCAL a:word, b:word = LocalSpace

ставит в соответствие^ идентификатору д значение [BP-2J, идентификатору b Ч значение [¬–-4|, идентификатору LocalSpace - число 4 (общий размер области локальных переменных в байтах) дл€ дальнейшего использовани€ в процедуре.

Ќаиболее эффективным методом инициализации локальных переменных €вл€етс€ помещение в стек их значени€ вместо уменьшени€ SP. ѕри таком подходе фрагмент инициализа1ц<и локальных переменных процедуры, приведенной в предыдущем примере, будет иметь следующий вид:

; sub sp, LocalSpace Ч оператор не нужен mov ах,42 push ax xor ax,ax push ax

ѕри использовании этого метода необходимо про€вл€ть осторожность, чтобы не испортить содержимое стека.

≈сли разрабатываема€ программа будет работать только на модел€х процессоров не-ниже 8018√), то is ней можно использовать еще один метод инициализации локальных переменных, заключающийс€ в применении команды PUSH с непосредственным операндом.  роме того, регистр BP можно сохран€ть не в стеке, а в каком-либо неиспользуемом в процедуре роистре, если таковой имеетс€.

19.5. ѕримеры применени€ ассемблерных подпрограмм в Borland Pascal

 

19.5.1. ћногоцелева€ подпрограмма представлени€ чисел в виде шестнадцатеричных цифр

 

Ёта подпрограмма выполн€ет преобразование параметра num в строку шестнадцатеричных цифр длиной (ByteCount*2). ƒл€ повышени€ скорости работы процедуры при преобразовании каждой тетрады (4 бита) байта в ней использовалась последовательность команд ADD-DAA-ADC-DAA.

HexStr написана на ассемблере как FAR-процедура, поэтому, если в тексте программы на Borland Pascal €вно не указан тип FAR, то либо ее объ€вление должно находитьс€ в интерфейсной секции модул€, либо при компил€ции необходимо указывать директиву компил€тора $F+.

јссемблерный код процедуры (файл HEX.ASM):

 

CODE SEGMENT

ASSUME cs:CODE,ds:NOTHING

; ѕараметры (+2 дл€ учета помещени€ в стек №р)

byteCount EQU BYTE PTR ss:[bp+6]

num EQU DWORD PTR ss:[bp+8]

; јдрес результата функции (+2 дл€ учета помещени€ в стек №р)

resultPtr EQU DWORD PTR ss:[bp+12]

HexStr PROC FAR

PUBLIC HexStr

push bp

mov bp,sp;попучить указатель на стек

;считывает по указанному адресу из пам€ти двойное слово,

;содержащие полный адрес, и загружает младшую половину в указанный регистр,

; а старшую в ES

les di,resultPtr;получить адрес области результата функции

mov dx,ds;сохранить DS Borland Pascal в DX

;считывает по указанному адресу из пам€ти двойное слово,

;содержащие полный адрес, и загружает младшую половину в указанный регистр,

; а старшую в DS

lds si,num;получить адрес числа

mov al,byteCount; количество байтов

xor ah,ah

mov cx,ax

add si,ax; начать со старшего байта числа

dec si

; сдвиг влево всех битов операнда на 1 бит

shl ax,1;сколько цифр? (2/байт)

; сброс флага направлени€ DF в регистре флагов

cld;запомнить номер цифры

hexloop:

; запись байта из ј’ в строку данных

stosb;запись длины строки результата HexLoop:

; установка флага направлени€ DF в регистре флагов, определ€€ обратное;направление выполнение строковых операций (по убыванию адресов элементов;строки)

std; просмотр числа от старшего; байта к младшему

;загрузка байта из строки

lodsb; получить следующий байт

mov ah,al;сохранить его

;логический сдвиг вправо битов операнда на 1 бит

shr al,1; выделить старшую тетраду

shr al,1

shr al,1

shr al,1

add al,90h;алгоритм преобразовани€

; корректировка операции слодени€, если результат сложени€ превышает 99,

; то возникает перенос и устанавливаетс€ флаг CF

daa

; —ложение оперантов, прибавл€€ к результату значени€ флага CF

adc al,40h

daa;тетрада преобразована в ASCII

; сброс флага направлени€ DF в регистре флагов

cld

stosb

mov al,ah;ѕреобразование младшей тетрады

and al,0Fh

add al,90h

daa

adc al,40h

daa

stosb

loop HexLoop

mov ds,dx;восстановление DS

pop bp

ret 6;длина параметров 6 байт

HexStr ENDP

CODE ENDS

END

ѕрограмма на Borland Pascal, использующа€ данную функцию, котора€ нaxодитс€ в объектном файле HEX.OBJ, может иметь следующий вид:

 

program HexTest;

var num: Word;

 

function HexStr (var num; ByteCount:byte):string; far; external;

{$L HEX}

 

begin

num:=12345;

Writeln(' Ўестнадцатеричный вид числа ',num, '=',HexStr(num,SizeOf(num)));

end.

 

18.1.9. —оглашени€ о вызовах, прин€тых в Pascal

 ак уже упоминалось раньше, при вызове функции в C++ выполн€етс€ помещение передаваемых параметров в стек в направлении слева направо, а по возвращению из нее Ч очистка стека от этих параметров. ѕомимо этих соглашений, Borland C++ поддерживает соглашени€ €зыка Pascal, согласно которым параметры передаютс€ в процедуру слева направо, а стек очищает вызываема€ функци€. ¬ключение соглашений €зыка Pascal достигаетс€ применением переключател€ командной строки -р или ключевого слова PASCAL.

ѕример использовани€ соглашений €зыка Pascal в ассемблерных функци€х:

'; ¬ызов: TEST (i,|, k);

i equ 8 j equ 6 k equ 4

.MODELL small.CODE PUBLIC TEST TEST PROC push bp mov bp.sp mov ax,[bp+i] add ax,[bp+j] sub ax,[bp+k] pop bp

ret 6 [возврат и очистка стека TEST ENDP END

Ќа рис. 18.4 приведен вид стека после выполнени€ команды MOV BP,SP.

 

 

 роме особенностей передачи параметров, соглашени€ €зыка Pascal подразумевают использование в идентификаторах всех внешних и общедоступных переменных прописных букв без предшествующего символа подчеркивани€.

ѕричиной, по которой могут использоватьс€ соглашени€ €зыка Pascal, €вл€етс€ уменьшение размера кода и увеличение скорости выполнени€, так как обычный код C++ генерирует дополнительные команды вида ADD SP, n дл€ очистки стека после выполнени€ процедуры.

 

–ис. 18.4. ¬ид стека при использовании соглашений €зыка Pascal.

 

 
 





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-10-01; ћы поможем в написании ваших работ!; просмотров: 394 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

Ќе будет большим злом, если студент впадет в заблуждение; если же ошибаютс€ великие умы, мир дорого оплачивает их ошибки. © Ќикола “есла
==> читать все изречени€...

1496 - | 1296 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.019 с.