| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
DATA ENDS
Переменных, выделяемых Турбо Ассемблером в сегменте глобаль-
ных данных, касаются два важных ограничения. Во-первых, эти пере-
менными являются "частными", они недоступны программе Турбо Пас-
каля (хотя вы можете передавать указатели на них). Во-вторых, они
не могут быть предварительно инициализированы, как типизованные
константы. Оператор:
MyInt DW 42 ; это не инициализирует
; MyInt значением 42
не вызовет ошибки при компоновке модуля с программой Турбо Паска-
ля, однако MyInt при выполнении программы не будет иметь значение
42.
Эти ограничения можно обойти, описав переменные или типизо-
ванные константы Турбо Паскаля с помощью директивы EXTRN, что
сделает их доступными Турбо Ассемблеру.
Выделение временной памяти
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В ваших программах на Турбо Паскале можно выделять также
временную память (локальные переменные) в стеке на время выполне-
ния каждого вызова. Перед возвратом управления эта память должна
быть освобождена, а значение регистра BP восстановлено. В следую-
щем примере процедура MyProc резервирует пространство для двух
целых переменных a и b:
CODE SEGMENT
ASSUME CS:CODE
MyProc PROC FAR ; procedure MyProc(i : integer);
PUBLIC MyProc
LOCAL a : WORD, b : WORD = LocalSpace ; a в [bp-2]
; b - в [bp-4]
i equ word ptr [bp+6] ; параметр i находится над
; сохраненным BP и адресом
; возврата
push bp ; нужно сохранить BP вызывающей
; программы
mov bp,sp ; теперь BP указывает на
; вершину стека
sub sp,LocalSpace ; зарезервировать пространст-
; во для двух слов
mov ax,42 ; загрузить в AX начальное
; значение A
mov a,ax ; и в A
Турбо Ассемблер 3.0/tasm/#2-2 = 134 =
xor ax,ax ; очистить регистр AX
mov b,ax ; инициализировать B нулем
mov b,ax ; выполнить нужные действия
.
.
.
mov sp,bp ; восстановить исходное
; значение SP
mov bp ; восстановить исходное
; значение регистра BP
ret 2
MyProc ENDP
CODE ENDS
END
Примечание: Директива Турбо Ассемблера LOCAL использу-
ется для создания идентификаторов и выделения пространства
для локальных переменных.
Оператор:
LOCAL a : WORD, b : WORD = LocalSpace
на время выполнения процедуры присваивает идентификатору a значе-
ние [BP-2], идентификатору b - значение [BP-4], а идентификатору
LocalSpace - число 4 (размер области локальных переменных). Пос-
кольку нет соответствующего оператора для создания идентификато-
ров, ссылающихся на параметры, вы должны использовать присваива-
ние i значения [BP+6].
Более разумный способ инициализации локальных переменных
заключается в том, чтобы вместо уменьшения SP занести в стек их
значения. Таким образом, вы должны заменить SUB SP,LocalSpace
инструкциями:
mov ax,42 ; получить начальное значение
; для a
push ax ; занести его в a
xor ax,ax ; обнулить AX
push ax ; и занести 0 в b
Если вы используете этот способ, нужно внимательно отслежи-
вать стек! Не следует ссылаться на идентификаторы a и b перед
тем, как они занесены в стек.
Другой вид оптимизации предусматривает использование инст-
рукции PUSH CONST для инициализации локальных переменных (ее мож-
но использовать при наличии процессором 80186, 80286 и 80386),
или сохранение BP в регистре вместо занесения его в стек (если
есть неиспользованные регистры).
Турбо Ассемблер 3.0/tasm/#2-2 = 135 =
Примеры подпрограмм на Ассемблере для Турбо Паскаля
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В данном разделе вы дадим некоторые примеры подпрограмм на
языке Ассемблера, которые вы можете вызывать из программ Турбо
Паскаля.
Подпрограмма шестнадцатиричного преобразования общего назначения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Содержащиеся в параметре num байты преобразуются в строку
шестнадцатиричных цифр длины (byteCount * 2). Поскольку каждый
байт порождает два символа, максимальное значение byteCount равно
127 (не проверяется). Для преобразования каждой группы (по 4 би-
та) в шестнадцатиричную цифру мы для скорости используем последо-
вательность add-daa-adc-daa.
Процедура HexStr (ее можно найти в файле HEX.ASM) написана
так, что вызываться она должна с помощью вызова дальнего типа.
Это означает, что ее следует описывать в интерфейсной части моду-
ля Турбо Паскаля или с помощью директивы компилятора {$F+}.
CODE SEGMENT
ASSUME cs:CODE,ds:NOTHING
; Параметры (+2 с учетом push bp)
byteCount equ byte ptr ss:[bp+6]
num equ dword ptr ss:[bp+8]
; Адресация к результату функции (+2 с учетом push bp)
resultPtr equ dword ptr ss:[bp+12]
HexStr PROC FAR
PUBLIC HexStr
push bp
mov bp,sp ; получить указатель
; стека
les di,resultPtr ; получить адрес
; результата функции
mov dx,ds ; сохранить DS Турбо
; Паскаля в DX
lds si,sum ; получить адрес числа
mov al,byteCount ; сколько байт?
xor ah,ah ; слово
mov cx,ax ; отслеживать число
; байт в CX
add si,ax ; начать со старшего
; байта числа
dec si
shl ax,1 ; сколько цифр?
Турбо Ассемблер 3.0/tasm/#2-2 = 136 =
; (2/байт)
cld ; сохранить число цифр
; (работать в прямом
; направлении)
stosb ; в приемнике - байт
; длины строки
NextLoop:
std ; сканировать число от
; старшего байта к
; младшему
lodsb ; получить следующий
; байт
mov ah,al ; сохранить его
shr al,1 ; выделить старшую
; группу бит
shr al,1
shr al,1
shr al,1
add al,90h ; специальная после-
; довательность шестнад-
; тиричного преобразования
daa ; использование инструкций
; ADD и DAA
adc al,40h
daa ; группа преобразована
; в код ASCII
cld ; сохраним ASCII и следуем
; далее
stosb
mov al,ah ; повторить преобразование
; для младшей группы
and al,0Fh
add al,90h
daa
adc al,40h
daa
stosb
loop HexLoop ; продолжать, пока не
|
adfun.ru
|
|
|
|