Возраждение
#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
Другие статьи номера:
Похожие статьи:
В этот день... 14 декабря