|
Возраждение
#1
31 января 1996 |
|
IS-DOS ассемблер - основы прогнраммирования на ассемблере для начинающих и программирование под IS-DOS.

Этот раздел справедливо можно разделить
на две части. Первая часть будет для на-
чинающих свой путь в мир языка програми-
рования 'ассемблер'. Вторая часть для уже
успевших основательно изучить последний,
но неосвоевших его окончательно или чуст-
вующих сложность в програмировании под
систему is-dos.
Многие начинающие програмисты при изу-
чении ассемблера, приходят к ряду встаю-
щих перед ними вопросов, на которые тре-
буется не мало времени что-бы с ними ра-
зобратся. Ведь мыслим мы все поразному,
да и разница мышления начинающего програ-
миста и профессионала на много различны.
Авторы же наиболее интересных статей по
ассемблеру так же не в состоянии предус-
мотреть все возможные вопросы, которые
могут возникнуть у пользователя, и свя-
затся с ними не каждый имеет возможность.
По этому мы будем рассматривать все что
читатель хотел бы узнать по этой теме,
стоит вам только написать нам по адресу
указанному в разделе реклама.
И так начнем мы сегодня с самых азов,
т. е. с возможных систем счисления чисел
в ЭВМ. Здесь мы с вами рассмотрим три ви-
да: десятичная, двоичная и шестнадцати-
ричная системы счисления (имеется так же
еше и восьмеричная).
Десятичные числа вам знакомы это есть
0,1,2,3,..,9,10,11,..,19,20,21,... и т.д.
Как видите их название произошло от того
что во всех этих числах участвуют цифры
от 0 до 9, их как раз десять.
Двоичные цифры. Вы правильно поняли они
состоят всего из двух цифр 0 и 1, напри-
мер 0,1,10,11,100,101,111,1000 и т.д. Как
их сравнить с десятичными, очень просто.
Десятичные Двоичные
0 0
1 1
2 10
3 11
4 100
5 101
и т.д.
В ассемблере они обозначаются знаком
'%', т.е когда мы пишем %10010011, то
имеем в виду число 147 десятичное. Вы
спросите, как же это касается компьютера?
Дело в том, что каждая ячейка памяти
(байт) может может принимать значения от
0 до 255 или %00000000 - %11111111. Это
хорошо видно если в basic-е вы проведете
эксперимент: poke 16384, <число 0-255>.
Если вы зто сделали то увидели, что вся
картина с пикселами (точками на экране)
очень напоминает двоичный код. Включенно-
му пикселу соответствует 1, а выключенно-
му 0. Теперь давайте подумаем как легче
нарисовать картинку записывая туда деся-
тичное число или двоичное где виден нам
каждый пиксел. Кстати не пытайтесь в во-
дить в basic-е двоичную форму числа, он
слишком стар и не образован. Если в экан-
ной области есть название пиксел то в ра-
бочей памяти это называют бит. Расклад
здесь такой:
Число 0..255.
┌────┬────┬────┬────┬────┬────┬────┬────┐
│7bit│бbit│Sbit│Чbit│Зbit│2bit│1bit│Obit│
└────┴────┴────┴────┴────┴────┴────┴────┘
Если бит включен то там 1, выключен 0.
Пример:
%10000000 = 128
7bit включен, остальные выключены.
Все слишком просто? Мы с вами согласны
двоичный код слишком прост, что при мно-
жестве чисел можно запутаться, десятичный
же неудобен. Выход есть, это шестнадцати-
ричный код или числа (разницы нет).
Вы спросите, где взять еще шесть цифр?
Выход находится если взять дополнительные
цифры из латинского алфавита A,B,C,D,E,F.
Теперь мы имеем все что нужно. А как же
это будет выглядеть на деле?
Десятичное Двоичное Шестнадцатиричное
0 %0000 0
1 %0001 1
2 %0010 2
3 %0011 3
4 %0100 4
5 %0101 5
6 %0110 6
7 %0111 7
8 %1000 8
9 %1001 9
10 %1010 A
11 %1011 B
12 %1100 C
13 %1101 D
14 %1110 E
15 %1111 F
Интересная получилась закономерность.
%1111 = F то %11111111 = FF. Значит один
байт можно представить не восмью разряда-
ми как вдвоичном коде, и не тремя как в
десятичном, а лиш двумя.
Пример:
255=%11111111=FF
Есть одно но, что бы компьютер не путал
десятичное с шестнадцатиричным есть спе-
циальный знак '#' (#7C), или другой 'h'
(7Ch), но тут нужно оговорить если число
начинается с буквы то в переди ставится
еше и нуль (OACh), это только для 'h'. И
еще IS-ASSMBLER, GENS, ZEUS не понимают
этой буквы, но зато TASM и все ассемблеры
на более крутых машинах поймут то и дру-
гое. Может шестнадцатиричные числа и по-
кажутся вам трудной системой счисления,
но вспомните когда вы учились читать, вам
тоже казалось слишком все это умным. А
теперь вас это даже не беспокоит. Но влю-
бом случае в ассемблере без этого значка
'#' нечего делать. Или вам придется зах-
ломлять программы двоичным кодом, что
приведет к трудно читамости ее для вас
самих же, так что не принебригайте этим
как не принебрегаете буквами при чтении.
Теперь вы готовы вступить в прекрасный
мир програмирования на языке ассемблер.
Всегда можно договориться с компьютером
на его родном языке, какая бы задача не
стояла перед вами. Ну чтож начнем.
РЕГИСТРЫ ДАННЫХ И АККУМУЛЯТОР
═════════════════════════════
В микропроцессоре Z-80, который управ-
ляет вашим компьютером есть специальные
ячейки где хранятся временные числа с ко-
торыми вы работаете и где они претерпива-
ют свои изменения. Назовем ячейки словом
регистр. Все вычисления и передача данных
работают только через регистры. Что бы
сложить два числа нужно сначало поместить
их в регистры и затем сложить их, причем
результат будет в одном из регистров. Вот
они A,B,C,D,E,H,L,F. В каждом этом регис-
тре может находится число от 0 до 255.
Причем B и C, D и E, H и L, могут объеди-
нятся, что говорит о расширении диапазона
используемых чисел от 0 до 65535. Пишутся
они BC, DE, HL. Но это не все есть еще
альтернативный набор (запасной), A', B',
C', D', E', H', L', F', они так и обозна-
чаются черточкой после буквы. Процессор
может работать только с одной групой ре-
гистров либо с основными, либо с альтер-
нативными. Есть команды переключающие с
одного набора на другой, причем альтерна-
тивные становятся основными (без '), а
основные альтернативными (с '). Опреди-
лить какой из наборов включен невозможно.
Есть регистры уже сдвоеные и разделить
их не возможно это IX, IY.
Регистр "A" самый главный его называют
аккумулятором, при вычислении в основном
туда помещается результат.
Регистр "F" самый интересный там не
хранят числа но смотрят что произошло при
вычислении. Здесь весь расклад только по
битовый.
┌─┬─┬─┬─┬─┬───┬─┬─┐
│S│Z│x│H│x│P/V│N│C│
└─┴─┴─┴─┴─┴───┴─┴─┘
7 6 5 4 3 2 1 0
Каждый отдельный бит в нем называется
флагом. Флаг установлен = 1, флаг сброшен
= 0.
Z(zero)-флаг нуля. Устанавливается если
результат операции равен нулю.
P/V(parity/overflow)-флаг четности пе-
реполнения. В логических операциях уста-
навливается при получении четности резу-
льтата, в арифметической - при переполне-
нии (число больше 127, т.е. 7bit вклю-
чен).
CY(carry)-флаг переноса. Устанавливает-
ся если при выполнении арифметических оп-
ераций, т. е. получилось число больше или
меньше чем влезет в регистр.
S(sing)-флаг вычитания. Устанавливается
если предыдущей командой было вычитание.
Остальные флаги расчитаны на внутреннюю
работу процессора. И использовать их зат-
руднительно.
СЧЕТЧИК КОМАНД
══════════════
Выполняя очередную команду, процессор
должен знать, откуда ему взять следующую.
За этим следит 16-разрядный счетчик ко-
манд регистр PC. Он может принимать зна-
чения от 0 до 65535. Поэтому Z-80 может
понимать в своей работе только эти адреса
и не на один адрес больше, в компьютерах
128k и больше все так же, но там есть
альтернативные страницы памяти которые
могут подменятся на основные, так только
удается обмануть процессор.
УКАЗАТЕЛЬ СТЕКА
═══════════════
16-разрядный регистр указателя стека PC
дополнительная возможность для програмис-
та. Это специально устанавливаемая поль-
зователем часть оперативной памяти, пред-
назначенная для временного хранения дан-
ных. Стек организован по принципу первый
вошел, последним вышел. При каждой записи
регистр PC уменьшается на 2. При взятии
данных обратно увеличивается на 2. Ре-
гистр PC показывает адрес где располога-
ется стек. Общение со стеком происходит
только с регистровыми парами.
ДРУГИЕ РЕГИСТРЫ
═══════════════
Регистр вектор прерываний I, использу-
ется во втором режиме прерываний. Его мы
расмотрим когда займемся самии прерывани-
ями.
Регистр регенерации динамической памяти
R, обслуживает аппаратные потребности
процессора и изменяется не предсказуемо
(не совсем правильно). Используется для
написания процедур случайного числа. Ста-
рший разряд аппаратно не используется,
заметьте это, редко им кто пользуется,
наверно програмисты в попыхах изучения
ассемблера не придали этому значения.
На этом мы остановимся на теме для на-
чинающего до следущего номера журнала. И
продолжим для тех кто уже практически
использовал програмирование в машинном
коде.
Вы наверное не раз пытались использо-
зовать трансляторы as.com и link.com.
Если кому-то это не удалось, то мы
подскажем.
Во первых программа должна быть набрана
в текстовом редакторе is-edit и иметь ра-
сширение 'as'. Затем пишется bat-файл ко-
торый будет транслировать програму в объ-
ектный код. Можно сделать еще проще, вам
известен файл extent.txt так вот в ведите
туда строку:
as :Q:IS-ASSMASMas /+l /+t /cut
Теперь любой файл можно от транслиро-
вать всего лишь нажатием клавиши [ENTER].
Если вдруг вы не поняли значение ключей
то посмотрите help as.com. Учтите что но-
вый файл с расширением 'obg' еще не готов
к запуску т.к. не прошел через линковщик.
С link.com сложнее здесь если вы хоти-
те создать запускаемый файл который обра-
щается к вашей библиотеке (к файлам выпо-
лняющим какие-то функции нужные програме,
но этот текст невошел в саму программу,
программа обращается к ним типа CALL $<
имя процедуры>), то вам следует создать
bat-файл указывающий имена всех не вошед-
ших процедур.
Пример:
демо.obg - главная программа;
$string.obg - процедура бегущей строки;
$cls.obg -процедура оригинальной очистки
экрана;
(все файлы в одном каталоге с bat-файлом)
Здесь bat-файл будет такой:
Q:IS-ASSMASMlink_/<адрес трансляции>_
демо_$string_$cls
_ - это пробел (строка не поместилась).
Весь текст только в одной строке.
Надеемся принцип работы ясен, а по клю-
чам вы найдете информацию в help link.com
и др.
Теперь некоторые процедуры которые по-
могут в вашей сложной работе. Прежде все-
го мы опубликуем процедуры логики, срав-
нения 16-битовых чисел. Эти процедуры мы
использовали для изготовления журнала и
они нам послужили для вычисления начала/
конца текста.
1.Сравнить HL>DE
(вход:HL-1е число);
( DE-2е число);
(выход:флаг C=1-ошибка);
$OPB LD A,D ;сравнить старшие
CP H ;байты.
JR C,OPB2 ;если H>D (верно)
;переходим на про-
;цедуру выхода вер-
;но.
JR NZ,OPB1 ;если H не равен D
;то переход не вер-
;но.
LD A,E ;сравнить младшие
CP L ;байты.
JR C,OPB2 ;L>E, верно.
OPB1 SCF ;установим флаг C
RET ;т.к. HL>DE не вер-
;но.
OPB2 XOR A ;сбросим флаг C т.
RET ;к. HL>DE.
2.Сравнить HL=DE
(вход:HL-1е число);
( DE-2e число);
(выход:флаг C=1-ошибка);
$OPBR LD A,D ;сравниваем старшие
CP H ;байты.
JR C,OPBR1 ;H>D-нет ошибки.
LD A,H ;сравниваем опять
CP D ;старшие байты.
RET C ;H не равно D-ошибка
LD A,L ;сравниваем младшие
CP E ;байты.
RET C ;L
Другие статьи номера:
Похожие статьи:
В этот день... 13 ноября