adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
Новый оператор asm может размещатся на той же строке, следуя
после точки с запятой, но он не может продолжаться на следующую
строку.
Точка с запятой не может быть использована для начала ком-
ментария (как это возможно в TASM). Для того, чтобы комментиро-
вать операторы asm, используют комментарии в стиле Си, т.е.
asm mov ax,ds; /*Этот комментарий правильный*/
asm pop ax; asm pop ds; asm iret; /*Комментарий правильный*/
asm push ds; ЭТОТ КОММЕНТАРИЙ НЕПРАВИЛЬНЫЙ!!
Заметим, что последняя строка приводит к ошибке, т.к. комен-
тарий здесь некорректен.
Пара <код операции> <операнды> переносится непосредственно в
программу на языке ассемблера, которую Турбо Си генерирует из ко-
манд Си. Любые Си-идентификаторы заменяются соответствующими эк-
вивалентами на языке ассемблера.
Возможности встроенного ассемблера не равнозначны возможнос-
тям полного ассемблера, так как многие ошибки не могут быть не-
медленно обнаружены. TASM будет ловить любые ошибки, которые мо-
гут здесь появиться. Однако TASM не может распознать
местонахождение ошибок в часности потому, что место положения ко-
манды в Си-программе утеряно.
- 419,420 -
Каждый оператор asm считается командой Си. Например:
myfunc()
{
int i;
int x;
if (i > 0)
asm mov x,4
else
i = 7;
}
Эта конструкция допустима в Си-операторе if. Заметим, что
нет необходимости ставить точку с запятой после команды mov x,4.
Оператор asm является единственным оператором Си, который зависит
от символа новой строки. Этого нет в остальной части языка Си,
однако, это соглашение принято для совместимости с основными ком-
пиляторами UNIX.
Оператор ассемблера может быть использован как выполняемый
оператор внутри функции или как внешнее объявление вне функции.
Операторы ассемблера, расположенные вне функции, находятся в сег-
менте данных (DATA), а расположенные внутри функции - в программ-
ном сегменте (СODE).
Приведем версию встроенного ассемблера для функции min
(представленной ранее в этой главе в разделе "Управление возвра-
щаемыми значениями").
int min (int V1, int V2)
{
asm mov ax,V1
asm cmp ax,V2
asm jle minexit
asm mov ax,V2
minexit:
return (_AX);
}
Этот пример показывает, почему использование встроенного ас-
семблера в Турбо Си более гибко и мощно, чем вызов .ASM подпрог-
рамм. Этот пример работает с модулями, компилируемыми как с боль-
шой, так и с малой моделями памяти, как с Паскаль, так и с
Си-соглашениями по вызову.
- 421,422 -
Эквивалент же .ASM всегда должен быть изменен в зависимости
от модели памяти и соглашения по вызову (Си или Паскаль). В .ASM
эквиваленте для min вы всегда отвечаете за смещение параметров и
написание идентификатора (_min или MIN); этого не нужно в случае
версии встроенного ассемблера.
Замечание: существует новый особый вызов _emit_, позволяющий
программировать на встроенном Турбо Паскале. Для более полной ин-
формации об _emit_ отсылаем вас к введению главы 2 "Руководства
по Турбо Си".
Любые коды операций 8086 могут быть включены как операторы
встроенного ассемблера. Существует 4 класса команд, допускаемых
компилятором Турбо Си:
- нормальные команды - обычный набор кодов операций 8086;
- строковые команды - специальные команды управления строками;
- команды перехода - различные команды перехода;
- директивы ассемблера - определение и размещение данных.
Заметим, что компилятор допускает любые операнды, даже если
они ошибочны или недопустимы с точки зрения ассемблера. Компиля-
тор не накладывает ограничений на формат операндов.
- 423,424 -
Команды
-----------------------------------------------------------------
Далее следует полный список мнемоники команд, которые могут
быть использованы в качестве нормальных команд:
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
aaa fcom fldl2t fsub or
aad fcomp fldlg2 fsubp out
aam fcompp fldln2 fsubr pop
aas fdecstp ** fldlpi fsubrp popa
adc fdisi fldz ftst popf
add fdivi fmul fwait push
and fdivp fmulp fxam pusha
bound fdivr fnclex fxch pushf
call fdivrp fndisi fxtract rcl
cbw feni fneni fyl2x rcr
clc ffree ** fninit fyl2xpl ret
cld fiadd fnop hlt rol
cli ficom fnsave idiv ror
cmc ficomp fnstcw imul sahf
cmp fidiv fnstenv in sal
cwd fidivr fnstsw inc sar
daa fild fpatan int sbb
das fimul fprem into shl
dec fincstr ** fptan iret shr
div finit frndint lahf sbc
enter fist frstor lds std
f2xm1 fistp fsave lea sti
fabs fisub fscale leave sub
fadd fisubr fsqrt les test
faddp fld fst mov wait
fbld fld1 fstcw mul xchg
fbstp fldcw fstenv neg xlat
fchs fldenv fstp not xor
fclex fldl2e fstsw
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Таблица 12.7. Мнемоника кодов операций
Замечание: когда вы используете мнемонику команд 80186 в
операторах встроенного ассемблера, то должны включить опцию ко-
мандной строки -1. Это вызовет вывод в компилятор ассемблера не-
обходимых операторов, так что TASM будет правильно понимать мне-
- 425,426 -
монику команд. Кроме того, если вы используете более ранние
версии ассемблера, то эта мнемоника кодов не поддерживается.
Другое замечание: если вы используете встроенный ассемблер в
подпрограммах с эмуляцией команд с плавающей точкой (опция TCC
-f), то операции, помеченные (**), не поддерживаются.
|
adfun.ru
|
|
|
|