CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
Вывод символов на экран ----------------------------------------------------------------- Теперь, когда вы немного знаете о чтении и записи в програм- ме, давайте напишем простую программу, которая выполняет просто эхоотображение строки набранных на клавиатуре символов на экране. Все необходимые для этого функции DOS, кроме одной, вы уже знае- те. Эта последняя функция необходима, поскольку у вас нет способа завершить программу, когда она закончит выполнение. Те, кто знаком с языками Паскаль или Си, могут подумать, что программа на Ассемблере просто закончит работу, когда она дойдет до конца основной программы. Но это не так. Чтобы завершить свою программу на Ассемблере, вы должны выполнить явный вызов функции DOS. Для завершения программы имеется несколько функций DOS, но наиболее предпочтительным методом является выполнение функции DOS с номером 4Ch (или 76 для тех, кто предпочитает десятичный вид). Зная это, можно теперь написать полную программу отображения сим- волов: DOSSEG .MODEL SMALL .STACK 100h .DATA .CODE EhcoLoop: mov ah,1 ; функция DOS ввода с ; клавиатуры int 21h ; получить следующую клавишу cmp al,13 ; это клавиша ENTER? jz EchoDone ; да, выполняем эхоотображение mov dl,al ; поместить символ в DL mov ah,2 ; функция DOS вывода на экран int 21h ; вывести на экран символ jnz EchoLoop ; отобразить следующий символ EchoDone: mov ah,4ch ; функция DOS завершения ; программы int 21h ; завершить программу END Введите программу точно в таком виде и запустите ее. Вы уви- дите, что каждый вводимый вами символ выведется дважды: один раз, когда он отображается DOS при вводе с клавиатуры, и второй раз, когда он отображается вашей программой. Важным моментом здесь яв- ляется то, что все действия: считывания символов клавиш, вывод символов на экран и завершение программы выполняются с помощью функций DOS. Базовая система ввода-вывода ----------------------------------------------------------------- Иногда функции DOS не отвечают вашим потребностям. Тогда настал момент обратиться к базовой системе ввода-вывода IBM PC - BIOS. В отличие от DOS и прикладных программ BIOS не загружается с диска и не занимает место в 640К доступной памяти. Вместо этого BIOS хранится в памяти, доступной только по чтению (ROM или ПЗУ), в той части адресного пространства процессора 8086, которое заре- зервировано для системных функций. BIOS является программным обеспечением IBM PC самого нижнего уровня. Даже DOS использует для управления аппаратурой функции BIOS. Лучше использовать функции BIOS, чем управлять аппаратными средствами непосредственно, поскольку, аналогично DOS, BIOS поз- воляет "скрыть" различия между различными компьютерами и устрой- ствами. С другой стороны, там, где это возможно, вам следует пользоваться функциями DOS, а не функциями BIOS, поскольку прог- раммы, использующие BIOS, могут приводить к конфликту с другими программами и в общем случае менее переносимы при работе на раз- ных ЭВМ. Выбор режима экрана ----------------------------------------------------------------- Наиболее решающей причиной использования BIOS является уп- равление дисплеем, так как DOS практически не предусматривает поддержки широких возможностей дисплеев IBM PC. Только с помощью вызова функций BIOS вы можете установить режим экрана, управлять цветами, получить информацию о дисплейном адаптере и т.д. Напри- мер, следующий код вызывает BIOS и устанавливает экран графичес- кого адаптера CGA в четырехцветный графический режим: . . . mov ah,0 ; функция BIOS установки ; режима mov al,4 ; номер режима для 4-цветной ; графики с разрешением 320х200 int 10h ; выполнить видеопрерывание ; BIOS для установки режима . . . Как вы наверное помните, мы уже говорили о том, что для установки видеорежима необходимо более 30 инструкций OUT. Теперь можно понять, что функция BIOS "Установить режим" избавляет вас от большого объема работы. В BIOS предусмотрен также ряд функций, не связанных с управ- лением дисплеем, включающих в себя обработку нажатий клавиш и уп- равление диском. Однако в общем случае эти задачи лучше выполнять с помощью функций DOS. Основным справочником по функциям BIOS является "Справочное руководство по интерфейсу с базовой системой ввода-вывода". Иногда необходимо обратиться к аппаратным средствам ----------------------------------------------------------------- Теперь, когда вы знакомы со всеми доводами в пользу необхо- димости использования функций DOS (или, если это абсолютно необ- ходимо, функций BIOS), пришло время рассказать о тех случаях, когда можно посоветовать вам обратиться непосредственно к аппара- туре. Например, программное обеспечение коммуникаций управляет последовательным портом IBM PC непосредственно с помощью инструк- ций IN и OUT, поскольку ни DOS, ни BIOS не предусматривают адек- ватной поддержки для последовательных коммуникаций. Аналогично, высокопроизводительная графика должна выполняться с помощью не- посредственного обращения к памяти дисплея, так как DOS не под- держивает графику, а BIOS делает это довольно медленно. Основным правилом при работе с аппаратными средствами явля- ется уверенность в том, что у вас нет другой альтернативы. Если имеются функции DOS или BIOS, которые вы можете использовать, то используйте их. Если же нет, обращайтесь к аппаратуре непосредст- венно. Кроме того, целью программирования является создание по- лезных программ, а не следование правилам. Другой стороны, чем меньше правил вы нарушаете, чем с меньшим числом проблем вы сто- лкнетесь. Другие ресурсы ----------------------------------------------------------------- Для программиста, работающего на Ассемблере, в IBM PC пре- дусмотрены также другие программные и аппаратные ресурсы. Мы не будем все их рассматривать, приведем только кратко некоторые из них (подробности вы можете найти в справочных материалах): - драйвер ANSI.SYS, предусматривающий улучшенное управление дисплеем без необходимости обращения к функциям BIOS; - системные таймеры поддерживают таймер астрономического времени, а также генерацию звука с помощью встроенного динамика РС и точный отсчет времени; - дополнительный арифметический сопроцессор 8087 значительно ускоряет выполнение операций с плавающей точкой. Глава 5. Основные элементы программы на языке Ассемблера ----------------------------------------------------------------- Теперь, когда вы поняли, почему язык Ассемблера является уникальным, можно заняться деталями программирования на Ассембле- ре. В этой главе вы узнаете об основных компонентах программы на Ассемблере. Сначала мы расскажем о минимальных требованиях к ра- ботающей программе на Ассемблере. Затем мы обсудим различные эле- менты строки, и как их можно сочетать друг с другом. Попутно мы расскажем много полезного об инструкциях, директивах и тех спо- собах, с помощью которых программа на Ассемблере может получить доступ к памяти. Вы увидите, как в Турбо Ассемблере определяются и используются сегменты, узнаете о выделении и использовании пе- ременных в памяти. Наконец, мы рассмотрим некоторые наиболее об- щеупотребительные инструкции. Объем охваченных здесь тем велик, но когда вы покончите с этой главой, вы узнаете достаточно, чтобы начать писать программы на Ассемблере. Реализовать это знание можно с помощью программы подсчета слов, приведенной в конце главы. Так как в данной главе только затрагиваются многие аспекты программирования на Ассемблере, то в Главу 6 "Более подробно о программировании на Турбо Ассемблере" и Главу 9 "Развитое прог- раммирование на Турбо Ассемблере" где эти темы получают дальней- шее развитие. Элементы и структура программы на языке Ассемблера ----------------------------------------------------------------- Теперь, когда вы лучше понимаете, что представляет собой программа на языке Ассемблера процессора 8086, вы готовы к тому, чтобы начать писать на Ассемблере программы. Давайте рассмотрим, каковы минимальные требования к работающей программе на Ассембле- ре. Даже простая программа на Ассемблере включает в себя некото- рое количество строк. Рассмотрим, например, следующую программу: DOSSEG ; директива упорядочивания ; сегментов .MODEL SMALL ; модели кода и данных ; ближнего типа .STACK 200h ; стек объемом 512 байт .DATA ; начало сегмента данных DisplayString DB 13,10 ; пара символов "возврат ; каретки/перевод строки" ; для начала новой строки ThreeChars DB 3 DUP (?) ; память для трех символов, ; введенных с клавиатуры DB '$' ; хвостовой символ "$", ; указывающий DOS, где ; завершить вывод строки ; DisplayString при ; выполнении функции 9 .CODE ; начало сегмента кода Begin: mov ax,@Data mov ds,ax ; DS указывает на сегмент ; данных mov bx,OFFSET ThreeChars ; указывает на ; ячейку памяти, где ; содержится первый символ mov ah,1 ; функция DOS ввода с ; клавиатуры int 21h ; получить следующую ; нажатую клавишу dec al ; вычесть из символа 1 mov [bx],al ; сохранить измененный ; символ inc bx ; указать на ячейку памяти, ; где содержится следующий ; символ inc 21h ; получить следующую ; нажатую клавишу dec al ; вычесть из символа 1 mov [bx],al ; сохранить измененный ; символ inc bx ; ссылка на ячейку памяти ; со следующим символом int 21h ; получить следующую ; нажатую клавишу dec al ; вычесть из символа 1 mov [bx],al ; сохранить измененный ; символ mov dx,OFFSET DisplayString ; ссылка на ; строку измененных ; символов mov ah,9 ; функция DOS вывода строки int 21h ; вывести измененные символы mov ah,4ch ; функция DOS завершения int 21h ; программы END Begin ; директива, отмечающая ; конец исходного кода и ; указывающая, где начинать ; выполнение при запуске ; программы Данная программа содержит упрощенные директивы определения сегментов DOSSEG, .MODEL, .STACK, .DATA и .CODE, а также директи- ву END. В каждой программе на Ассемблере, чтобы обеспечить опре- деление сегментов и управление ими, необходимы директивы опреде- ления сегментов (упрощенные или стандартные), а завершать программу на Ассемблере всегда должна директива END. Директивы определения сегментов и директиву END, а также некоторые другие директивы мы опишем в данной главе. Директивы представляют собой только "рамки" программы на Ас- семблере. В самой программе необходимы также строки исходного кода, выполняющие какие-либо действия, например: mov [bx],al и inc dx Эти строки представляют собой мнемоники инструкций, соот- ветствующие набору инструкций процессора 8086, список которых приведен в предыдущей главе. Однако, перед тем, как вы сможете использовать инструкции или директивы, вы должны изучить формат строки кода Ассемблера, так что давайте рассмотрим его. Если вы захотите узнать, что же делает первая программа (приведенный в выше пример), введите ее, запустите, наберите IBM, после чего программа ответит вам: HAL Программа считывает три символа, вычитает из каждого символа значение 1 и выводит на экран результат.