С
машиной
на
«ты»
Г
Nick ‘nVr’
В прошлый раз мы выяснили, что предоставляет нам М П 8 0 2 8 Б в режиме реальных адресов. Теперь,
собственно говоря, пришло время применять знания на практике. Сегодня я расскажу вам, дорогие
читатели, об объявлении переменных, основных командах языка Ассемблера, о директивах сегментации
и о многом другом, что необходимо для построения реальных программ.
П р о д ол ж е н и е , н а ч а л о см. в М К , № 3 9 (314)
Часть 1. Ярщипы построения программ
П
режде всего — каркас программы. Для того чтобы соз-
дать обычную ЕХЕ-программу MS-DOS и получить все вы-
текающие отсюда преимущества, в общем случае исполь-
зуется сегм ентация — код, данные и стек помещаются в
разные области памяти, чтобы не пересекались друг с другом.
Разбить программу на сегменты с помощью языка Ассембле-
ра (фирм Microsoft или Borland) можно двумя способами — пу-
тем краткой и полной сегментаций.
Краткая сегментация проста в использовании, но далеко
не универсальна.
.2 8 6 ; у к а за н и е ти п а п р о ц е ссо р а
.MODEL SMALL »-указание м оде ли п а м я ти . "М алой " м оде-
л и , определяю щ ей 64 Кб п ам яти п о д к о д и 64 Кб п о д д а н -
ные , как п р а в и л о , д о с та т о ч н о
.286
-S TA C K 1 0 ОН ; вы деление 256 б а й т п о д с е гм е н т с те к а
. D ATA , о б ъ я в ле н и е н а ч а ла с е гм е н та данны х
«о б ъ я в л е н и е переменных>
.CO D E ; конец с е гм е н та да нны х, н а ч а ло с е гм е н та к о да
s t r t : ; т о ч к а в х о д а в програм м у
< к о д программы>
END s t r t ; к онец программы с ука за ни ем то ч к и в х о да
Имена сегментов при короткой сегментации таковы:
© stack ,
©code, © data.
Полная сегментация немного сложнее, но обеспечивает
куда большие возможности:
.286
STACK_SEG SEGMENT STACK ; о бъявление с те к о в о го сегм ента
adw 128 dup (? ) ; размер = 128 с л о в , не и ни ц и а ли зи р уе тся
STACK SEG ENDS ; о кончани е с е гм е н та с те к а
D ATA SEGMENT ; о б ъ я в ле н и е с е гм е н та данны х
«о б ъ я в л е н и е перем енны х»
D ATA ENDS
CODE SEGMENT ; о б ъ я в ле н и е се гм е н та кода
S t r t :
«к о д програм м ы »
CODE ENDS
END s t r t ; окончани е программы
Как видно, используя полную сегментацию, можно создать
столько сегментов, сколько вам заблагорассудится, и как
угодно именовать их. Вдобавок, в любой сегмент можно пи-
сать информацию любого типа.
Кстати, о полной сегментации. В сегменте кода первой
строкой желательно прописать директиву
ASSUME:
ASSUME C S :C O D E , D S : D A TA , S S : STACK SEG
Пользы от нее особой нет, но лучше придерживаться стан-
дартов.
Теперь о том, что касается объявления перем енны х. В язы-
ке Ассемблера известны 6 основных типов данных:
^
Db
- байт;
7
dm — слово (2 байта);
7
Dd
двойное слово (L o n g in t / lo n g для
целых
и S i n -
g l e для вещественных чисел);
7
D f
6 б ай т, вспоминаем типы r e a l
и
f l o a t ;
7
Dq — 8
байт, типы
D o u b le
и
с о м р ,
который в Турбо-пас-
кале использовался для хранения 64-разрядных целых чисел;
7
D t — 10 бай т,
тип
e x t e n d e d — вещ ественны е чи сла в
ф орм ате
8 0 8 7.
Переменные можно объявлять так:
Имя т и п З н а ч е н и е 1 , З н а ч е н и е 2 , _ , ЗначениеЫ
Имя т и п к о л и ч е с тв о элем енто в d u p ( з н а ч е н и е )
Имя т и п " т е к с т о в а я с т р о к а "
Первый способ используется, когда надо задать одиноч-
ную переменную либо предварительно проинициализиро-
ванный различными значениями массив. Второй — когда мас-
сив необходимо проинициализировать одинаковыми значе-
ниями или просто выделить под него память (тогда в качест-
ве значения используется знак вопроса).
.. Ну, думаю, с треть-
им все и так ясно © .
Что до записи чисел, то Ассемблер понимает целые чис-
ла в двоичной, восьмеричной, десятичной и шестнадцатерич-
ной системах, а также десятичные числа с плавающей точ-
кой. Выглядит
ЭТО
так:
10101010b, 74560, 123, 54h, 23 4 .5 6 7 6 7 .
Шестнадцатеричные числа, начинающиеся с «буквы», долж-
ны в начале содержать
0.
Часть 2: Система команд 1111
80286 для начинающий
М аш инная команда на языке Ассемблера в общем виде
имеет такой вид:
[М е т к а ]: [п р е ф и к с] ком анда [о п е р а н д 1 ], [о п е р а н д 2 ],
[о п е р а н д З ]
Правила использования меток точно такие же, как и в язы-
ках высокого уровня, разве что предварительно их не надо
объявлять.
Зачастую команды имеют 1 - 2 операнда, или же не име-
ют их вовсе. Трехоперандными, являются лишь некоторые ко-
манды умножения и деления. Префикс — это отдельная од-
нобайтная команда, указывающая процессору на особен-
ности выполнения основной команды.
Примеры команд:
M l: mov a x , b x ; M l — м етка, mov — команда, ax и b x — операнды
М 2 :p u s h s i
Rep m ovsb ; r e p - п р е ф и к с , m ovsb — к о м а н да .
Команды Ассемблера подразделяются на такие категории:
■7 команды передачи данных;
7 арифметические команды;
7 логические и сдвиговые команды;
7
команды передачи управления и команды управления
процессором;
7
цепочечные команды;
7
команды сопроцессора (если есть);
7
команды расширений M M X /S S E /3D N O W /.
.. (для про-
цессоров класса Pentium M M X и выше);
7
команды передачи данных.
Итак, как известно из предыдущего рассказа, память в
общем виде можно адресовать выражением типа
сегм ентны й р е г и с т р : [Р ег1+ Р е г2+см ещ ени е]
причем ни один из этих элементов не является обязательным. В
качестве сегментного регистра могут выступать
CS, DS, ES
и
SS
(в машинном коде они, кстати, представляются в виде префик-
сов команды), в качестве
P e r l
— вр или вх, в качестве
Р ег2
S i
или
d i ,
а смещение задается однобайтным числом (-1 26/+127).
Иногда, когда вы адресуетесь к памяти, необходимо ука-
зать, сколько байт надо взять (или поместить) по указанно-
43/318
25
о к т я б р я
-01
н о я б р я
2004
предыдущая страница 38 Мой Компьютер 2004 43 читать онлайн следующая страница 40 Мой Компьютер 2004 43 читать онлайн Домой Выключить/включить текст