| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
Заметим, что исходное состояние регистра DS сохраняется при
входе в функцию _AsmFunction с помощью инструкции PUSH и перед
выходом восстанавливается с помощью инструкции POP. Даже в сверх-
большой модели памяти Borland C++ требует, чтобы все функции сох-
раняли регистр DS.
Общедоступные и внешние идентификаторы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Программы Турбо Ассемблера могут вызывать функции С++ и ссы-
латься на внешние переменные Си. Программы Borland C++ аналогич-
ным образом могут вызывать общедоступные (PUBLIC) функции Турбо
Ассемблера и обращаться к переменным Турбо Ассемблера. После то-
го, как в Турбо Ассемблере устанавливаются совместимые с Borland
C++ сегменты (как описано в предыдущих разделах), чтобы совместно
использовать функции и переменные Borland C++ и Турбо Ассемблера,
нужно соблюдать несколько простых правил.
Подчеркивания и язык Си
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Если вы пишете на языке Си или С++, то все внешние метки
должны начинаться с символа подчеркивания (_). Компилятор Си и
С++ вставляет символы подчеркивания перед всеми именами внешних
функций и переменных при их использовании в программе на Си/С++
автоматически, поэтому вам требуется вставить их самим только в
ассемблерных кодах. Вы должны убедиться, что все ассемблерные об-
ращения к функциям и переменным Си начинаются с символа подчерки-
вания, и кроме того, вы должны вставить его перед именами всех
ассемблерных функций и переменных, которые делаются общими и вы-
зываются из программы на языке Си/С++.
Например, следующая программа на языке Си (link2asm.cpp):
extrn int ToggleFlag();
int Flag;
Турбо Ассемблер 3.0/tasm/#2-2 = 87 =
main()
{
ToggleFlag();
}
правильно компонуется со следующей программой на Ассемблере
(CASMLINK.ASM):
.MODEL SMALL
.DATA
EXTRN _Flag:word
.CODE
PUBLIC _ToggleFlag
_ToggleFlag PROC
cmp [_Flag],0 ; флаг сброшен?
jz SetFlag ; да, установить его
mov [_Flag],0 ; нет, сбросить его
jmp short EndToggleFlag ; выполнено
SetFlag:
mov [_Flag],1 ; установить флаг
EndToggleFlag:
ret
_ToggleFlag ENDP
END
При использовании в директивах EXTERN и PUBLIC спецификатора
языка Си правильно компонуется со следующей программой на Ассемб-
лере (CSPEC.ASM):
.MODEL SMALL
.DATA
EXTRN C Flag:word
.CODE
PUBLIC C ToggleFlag
ToggleFlag PROC
cmp [Flag],0 ; флаг сброшен?
jz SetFlag ; да, установить его
mov [Flag],0 ; нет, сбросить его
jmp short EndToggleFlag ; выполнено
SetFlag:
mov [Flag],1 ; установить флаг
EndToggleFlag:
ret
ToggleFlag ENDP
END
Примечание: Метки, на которые отсутствуют ссылки в
программе не Си (такие, как SetFlag) не требуют предшеству-
ющих символов подчеркивания.
Турбо Ассемблер автоматически при записи имен Flag и
ToggleFlag в объектный файл поместит перед ними символ подчерки-
вания.
Турбо Ассемблер 3.0/tasm/#2-2 = 88 =
Различимость строчных и прописные символов в идентификаторах
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В именах идентификаторов Турбо Ассемблер обычно не различает
строчные и прописные буквы (верхний и нижний регистр). Поскольку
в С++ они различаются, желательно задать такое различие и в Турбо
Ассемблере (по крайней мере для тех идентификаторов, которые сов-
местно используются Ассемблером и С++). Это можно сделать с по-
мощью параметров /ML и /MX.
Переключатель (параметр) командной строки /ML приводит к
тому, что в Турбо Ассемблере во всех идентификаторах строчные и
прописные символы будут различаться (считаться различными). Пара-
метр командной строки /MX указывает Турбо Ассемблеру, что строч-
ные и прописные символы (символы верхнего и нижнего регистра)
нужно различать в общедоступных (PUBLIC) идентификаторах, внешних
(EXTRN) идентификаторах глобальных (GLOBAL) идентификаторах и об-
щих (COMM) идентификаторах. В большинстве случаев следует также
использовать параметр /ML.
Типы меток
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Хотя в программах Турбо Ассемблера можно свободно обращаться
к любой переменной или данным любого размера (8, 16, 32 бита и т.
д.), в общем случае хорошо обращаться к переменным в соответствии
с их размером. Например, если вы записываете слово в байтовую пе-
ременную, то обычно это приводит к проблемам:
.
.
.
SmallCount DB 0
.
.
.
mov WORD PTR [SmallCount],0ffffh
.
.
.
Поэтому важно, чтобы в операторе Ассемблера EXTRN, в котором
описываются переменные С++, задавался правильный размер этих пе-
ременных, так как при генерации размера доступа к переменной С++
Турбо Ассемблер основывается именно на этих описаниях.
Если в программе на языке С++ содержится оператор:
char c
то код Ассемблера:
Турбо Ассемблер 3.0/tasm/#2-2 = 89 =
.
.
.
EXTRN c:WORD
.
.
.
inc [c]
.
.
.
может привести к весьма неприятным ошибкам, поскольку после того,
как в коде на языке С++ переменная c увеличится очередные 256
раз, ее значение будет сброшено, а так как она описана, как пере-
менная размером в слово, то байт по адресу OFFSET c + 1 будет
увеличиваться некорректно, что приведет к непредсказуемым резуль-
татам.
Турбо Ассемблер 3.0/tasm/#2-2 = 90 =
Между типами данных С++ а Ассемблера существует следующее
соотношение:
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Тип данных С++ і Тип данных Ассемблераі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і unsigned char і byte і
і char і byte і
і enum і word і
і unsigned short і word і
і short і word і
і unsigned int і word і
і int і word і
і unsigned long і dword і
і long і dword і
і float і dword і
і double і qword і
і long double і tbyte і
і near* і word і
і far* і dword і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Внешние дальние идентификаторы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Если вы используете упрощенные директивы определения сегмен-
|
adfun.ru
|
|
|
|