Раздел 1: Регистры и параметры


1.1 Использование регистров


В создаваемых ассемблерных программах можно использовать все регистры процессора. Но чтобы предотвратить путаницу с функциями С и С++, необходимо восстанавливать bp, cs, sp и ss, которые они имели до запуска созданной подпрограммы. Тогда можно быть совершенно уверенным, что обращение к другим функциям не изменит эти регистры. Также нельзя забывать, что С использует регистры si и di для регистровых переменных, поэтому при использовании встроенного ассемблера замедляется общая работа программы.

К регистрам ax, bx, cx, dx и es можно обращаться свободно и не нужно резервировать их значения до окончания подпрограммы. Эта свобода касается и других функций, поэтому надо помнить, что эти регистры изменяться, если вызываются функции С и С++ из ассемблерных подпрограмм.


1.2 Ассемблерные операторы Inline


Ассемблерные операторы inline начинаются словом asm, за которым следует инструкция и ее операнды. Например, чтобы синхронизировать программу с внешним сигналом прерывания, можно написать:

/* ожидание прерывания*/

asm sti

asm hlt

printf(“Прерывание получено\n”)

Когда ранние версии Turbo C компилируют программу со встроенными командами asm, компилятор сперва создает ассемблерный текст для всей программы, вставляя в текст наши ассемблерные инструкции вместе с откомпилированным кодом для остальных операторов С. Затем компилятор вызывает Turbo Assembler и Linker (компоновщик), чтобы провести ассемблирование и подключить программу к конечному файлу кода. Более поздние версии Turbo и Borland C++ могут компилировать операторы asm без вызова TASM. Полный синтаксис asm:

asm[метка] мнемоника/директива операнды [;] [/*С комментарий*/]

Точки с запятыми в конце строк asm и комментарии С, расположенные между /*и*/ удаляются из текста перед ассемблированием, поэтому их можно опускать в тексте программы.


1.3 Размещение данных и операторов в тексте программы


Каждая строка текста программы С и С++ находится либо внутри, либо снаружи функции, и операторы asm могут вставляться как в одном, так и в другом месте. Конкретное положение оператора asm влияет на то, куда ассемблируется код или директива. Если оператор asm появляется снаружи функции, то он ассемблируется в сегмент данных программы, если внутри функции - в кодовый сегмент. Обычно, чтобы создать переменные, операторы asm вставляются снаружи функций; для создания кода их следует вставлять внутрь функций. Например:

asm count db ?

int main()

{

asm shl [count], 1/*умножение count на 4*/

asm shl [count], 1

return 0;

}

Переменная count объявляется в сегменте данных программы (относительно ds). Операторы внутри функции main умножают count на 4, используя вместо mul быстрые инструкции сдвига shl. Если объявлять переменные внутри функции, данные ассемблируются в кодовый сегмент, требуя особого обхождения:

int main()

{

asm jmp OverThere

asm count db ?

OverThere:

asm shl [count], 1 /* умножение count на 4*/

asm shl [count], 1

return 0;

}

Поскольку теперь переменная count находится в кодовом сегменте, требуется инструкция jmp, чтобы избежать случайного восприятия значения count в качестве машинного кода и его исполнения.


7



Раздел 2: Особенности данных


2.1 Разделение данных


Inline операторы asm имеют свободный доступ к переменным и структурам С и C++ - одно из самых привлекательных преимуществ метода inline по сравнению с подходом посредством внешних модулей. Самое интересное в типах данных ассемблера и С++, что dq может использоваться для создания инициализированных переменных двойной длины с плавающей точкой в языке ассемблера, но в Turbo Assembler отсутствуют директивы для непосредственного создания переменных с плавающей точкой.

В операторах asm можно ссылаться на переменные типов С++. Например:

unsigned char initial

initial = 'T'

asm mov dl, [initial] /*Загрузка символа в dl*/

asm mov ah, 2 /* Пересылка символа в ДОС */

asm int 21h /* Стандартная выходная функция */

Беззнаковая символьная переменная initial загружается оператором asm в dl. Так как и dl, и беззнаковые символьные данные имеют длину один байт, нет необходимости в ссылке использовать определитель Byte, хотя его применение и не будет ошибкой:

asm mov dl, [Byte ptr initial]


2.2 Объявление ассемблерных данных


Можно объявить переменные для использования только ассемблерными операторами. Например, чтобы создать 16-битовое слово с именем TwoBytes и загрузить значение переменной в сх, можно написать:

asm TwoBytes db 1, 2

int main()

{

asm mov cx, [Word ptr TwoBytes]

return 0

}

Переменная TwoBytes объявляется в сегменте данных программы (снаружи функции), с использованием директивы db, чтобы хранить в памяти 2 байта (1 и 2). Оператор ассемблера затем загружает TwoBytes в сх. Определитель Wordptr необходим для ссылки на TwoBytes как на 16-битовое слово.

Поскольку TwoBytes объявляется в операторе asm, на эту переменную нельзя ссылаться в тексте программы С или C++. Поэтому, если только не требуются отдельные переменные для ассемблерных инструкций, следует объявлять их обычным образом и ссылаться на них из ассемблерного модуля.



Информация о работе «Взаимосвязь языков C и ассемблера»
Раздел: Информатика, программирование
Количество знаков с пробелами: 22437
Количество таблиц: 1
Количество изображений: 1

Похожие работы

Скачать
274963
85
0

... ячейка, а имя переменной превращается в адрес ячейки. Появление этого адреса происходит в результате работы специального оператора языка (NEW), однако его значение в большинстве случаев не используется при программировании на алгоритмических языках типа Паскаль. Условимся считать, что адрес ячейки, которая будет хранить переменную А, есть А. Или, другими словами, А - это общее имя переменной и ...

Скачать
149178
9
8

... реализации заложена в основу написания данной программы. В ходе выполнения данного дипломного проекта была разработана программа управления автоматизированным комплексом многоканальной связи. Предъявленные в техническом задании к проекту требования выполнены полностью: программное обеспечение для процессора АТ89С51 разработано в соответствии с общим алгоритмом ПО изделия ТС16Е1, ОЗУ данных ...

Скачать
48658
0
0

... времени на возню с файлами на дисках или ожидание ввода, не смогут продемонстрировать какое-то впечатляющее увеличение скорости. 2. КЛАССИФИКАЦИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ 2.1. Машинно – ориентированные языки  Машинно – ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и ...

Скачать
37109
5
4

... , которые соответствуют определённым процедурам преобразования информации. Эффективная реализация таких процедур обеспечивается оформлением их в виде специальных макрокоманд и включением последних в язык программирования, доступный программисту. Макрокоманды переводятся в машинные команды двумя пу-тями – расстановкой и генерированием. Развитые автокоды получили название Ассемблеры. 3.1.4 Макрос ...

0 комментариев


Наверх