Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асс 2-1-1печать.doc
Скачиваний:
16
Добавлен:
03.05.2015
Размер:
231.94 Кб
Скачать

Аппаратные ресурсы Ассемблера

Команды ассемблера используют содержимое различных регистров процессора, логическая модель которых приведена на рисунке 1.

Сегментные регистры. Регистр CS - содержит начальный адрес сегмента кода. Этот адрес, суммированный со значением смещения в указателе команд (IP), определяет очередную выполняемую команду

Регистр DS - содержит начальный адрес сегмента данных. В прос-тейшем случае этот адрес плюс смещение, указанное в инструкции, задает адрес в сегменте данных.

Регистр SS - содержит начальный адрес регистра стека.

Регистр ES - используется для адресации памяти в строковых опе-рациях. В этом плане он похож на регистр DI.

Регистр ES инициализируется программой на ассемблере.

Регистры общего назначения AX,BX,CX,DX.

Регистры общего назначения являются основными рабочими регист-рами ассемблерных программ. Их отличает то, что к ним можно адресо-ваться одним словом или однобайтовым кодом. Левый байт считается старшим, а правый – младшим.

Регистр AX - первичный аккумулятор, используется во всех опера-циях ввода/вывода, в некоторых операциях со строками и в некоторых арифметических операциях. Регистр BX - базовый регистр, единст-венный из регистров общего назначения, используемый в индексной адресации. Кроме того, регистр BX используется при вычислениях.

Ah

Al

Управление программами

Bh

Bl

Ch

Cl

Dh

Dl

SP

CS

BP

DS

SI

SS

DI

ES

Данные

ПАМЯТЬ

Арифметикологическое устройство

Устройство управления

Регистр флагов

Указатель команд

Рис. 1 Логическая модель регистров процессора

Регистр DX - регистр данных. Используется в некоторых операциях ввода/вывода, в операциях умножения и деления больших чисел сов-местно с регистром AX.

Любой из регистров общего назначения может быть использован для суммирования или вычитания 8- или 16-разрядных величин.

Регистры указателя SP и BP.

Регистры указателя используются для обращения к данным в сег-менте стека.

Регистр SP - указатель стека. Используется для временного хране-ния адресов и иногда данных. Адресует стек аналогично регистру SS.

Регистр BP - указатель базы. Обеспечивает ссылки на параметры (данные и адреса, передаваемые через стек).

Индексные регистры SI и DI.

Индексные регистры используются для адресации, а также для вы-полнения операций сложения и вычитания.

Регистр SI - индекс источника. Используется в некоторых операци-ях со строками или символами подобно регистру DS.

Регистр DI - индекс приемника. Используется в тех же операциях, что и регистр SI. Подобен регистру ES.

Регистр указателя команд IP используется для выборки очередной команды программы с целью ее исполнения.

Регистр флагов Flags содержит девять активных битов (из 16), которые отражают состояние машины и результаты выполнения ма-шинных команд.

OF (переполнения) равен 1, если возникает арифметическое пере-полнение, т.е. когда объем результата превышает размер ячейки назна-чения.

DF (направления) устанавливается в 1 для автоматического декре-мента в командах обработки строк, и в 0 для инкремента.

IF (разрешения прерывания) прерывания разрешены, если IF=1; если IF=0, то распознаются лишь немаскированные прерывания.

TF (трассировки) , если TF=1, то процессор переходит в состояние прерывания INT 3 после выполнения каждой команды.

SF (знака) - SF=1, когда старший бит результата равен 1. Иными словами, SF=0 для положительных чисел и SF=1 для отрицательных чисел.

ZF (нулевого результата)- ZF=1, если результат равен нулю.

AF (дополнительный признак переноса) - этот признак устанавливается в "1" во время выполнения команд десятичного сло-жения и вычитания при необходимости выполнения переноса или заема между полубайтами числа. Он полезен при проведении операций над числами длиной в несколько слов, которые сопряжены с переноса-ми и заемами из слова в слово.

Краткий перечень команд процессора

Пересылка данных

MOV PUSH POP XCHG OUT INXLAT LEA LDS

LES LAHF SAHFPUSHF POPF

Арифметические операции

ADD ADC INC SUB SBB DEC

CMP MUL IMUL DIV IDIV NEG

AAA DAA AAS DAS AAM AAD

CBW CWD

Логические операции

NOT SHL/SAL SHR SAR ROL ROR

RCL RCR AND TEST OR XOR

Обработка данных

REP MOVS CMPS SCAS LODS STOS

CMPB CMPSW LODSB LODSW MOVSB MOVSB

MOVSW REPE REPNZ SCASB SCASW STOSB

STOSW

Команды передачи управления

CALL JMP RET

Команды условного перехода

JA JLE JNL JS

JAE JNA JNLE JZ

JB JNAE JNO LOOP

JBE JNB JNP LOOPE

JC JNBE JNS LOOPNE

JCXZ JNC JNZ LOOPNZ

JE JNE JO LOOPZ

JG JNE JP JGE

JL JPE JNGE JPO

Команды прерывания

INT INTO IRET

Управление состоянием процессора

CLС CMC STС CLD STD CLI

STI HLT WAIT ESC LOCK NOP

Простая программа на Ассемблере включает в себя некоторое ко-личество строк. Рассмотрим, например, программу « 1.asm».

;Имя сегмента стека - STACKSG

STACKSG SEGMENT PARA STASK ’STASK’ ;Стандартный заголовок определения стека

DW 32 DUP(?) ;Задание глубины стека

ENDS ;Конец сегмента стека

;Определение сегмента данных

;Имя сегмента данных -DATASG

DATASG SEGMENT PARA ‘DATA’ ;Стандартный заголовок определения данных

;Здесь определяются данные

STRG DB 'Это строка результат выполнения программы',13,10,'$'

ENDS ;Конец сегмента данных

;Сегмент кода - тело программы

CODESG SEGMENT PARA ‘CODE’ ;Заголовок сегмента кода

BEGIN PROC FAR ;Начало программы - основной процедуры

;-------------------------------------------------------------------------

ASSUME CS; CODESG DS; DATASG SS; STASKSG; \

PUSH DS ;

SUB AX,AX ; Стандартный заголовок любой

PUSH AX ; EXE - программы

MOV AX, DATASG ; /

MOV DS,AX ; /

;-------------------------------------------------------------------------

;Непосредственно программа

LEA DX, STRG

MOV AH, 09

INT 21H

;-------------------------------------------------------------------------

RET ;

BEGIN ENDP ;Стандартный конец программы

CJDESG ENDS ;

END BEGIN

END BEGIN - директива, отмечающая конец исходного кода и ука-зывающая, где начинать выполнение при запуске программы.

Каждой программе на Ассемблере, чтобы обеспечить определение сегментов и управление ими, необходимы директивы определения сег-ментов (упрощенные или стандартные), а завершать программу на Ас-семблере всегда должна директива END.

Директивы представляют собой только "рамки" программы на Ас-семблере. В самой программе необходимы также строки исходного кода, выполняющие какие-либо действия, LEA DX,STRG, MOV AH,09.

Эти строки представляют собой группы символов, соответствующие набору инструкций процессора 80Х86. Однако перед тем, как использо-вать инструкции или директивы, следует изучить формат строки кода Ассемблера.

Строка на Ассемблере включает четыре поля: поле метки, поле кода операции, поле операнда и поле комментариев. Второе и третье поля считаются обязательными при работе с операндами. Пример записи строки:

М2 ADD BX ; сложение содержимого аккумулятора с регистром BX

Все символы, размещенные после символа “;” не транслируются и на работу программы влияния не оказывают. Поэтому в поле комментариев можно делать произвольные записи, в том числе разделяющие програм-му на фрагменты.

Метка (М2) ставится в строку при необходимости передачи управле-ния на нее.

В программировании первой программой традиционно является про-грамма, выводящая на экран сообщение 'Это строка результат выполне-ния программы'. Войдите в текстовый редактор (один из тех редакторов, которые формируют файлы в коде ASCII) и введите строки программы под названием 1 asm.

По сравнению с программами на языках Си или Паскаль программы на Ассемблере длиннее, поскольку каждая инструкция Ассемблера вы-полняет меньше функций, чем инструкция Паскаля или Си. С другой стороны можно комбинировать инструкциями Ассемблера так, как за-хочется. Это означает, что в отличие от языков Си и Паскаль, Ассемб-лер позволяет вам программировать компьютер таким образом, что он будет делать все, на что способен. Часто это стоит нескольких допол-нительных строк.

Перед запуском программы ее необходимо сохранить. Однако предварительно потребуется преобразовать программу в выполняемый вид (рис.2), для чего служат два дополнительных шага – ассемблиро-вание и компоновка.

На этапе ассемблирования исходный код (текст программы) пре-вращается в промежуточную форму, которая называется объектным модулем, а на этапе компоновки один или несколько модулей объе-диняются в выполняемую программу. Ассемблирование и компоновку можно выполнять с помощью командной строки.

Для ассемблирования файла 1.asm наберите в командной строке

TASM exe.1 asm.

и нажмите клавишу ENTER. Если вы не задали другое имя, файл 1.asm будет ассемблирован в файл 1.obj. ( Заметим, что расширение имени файла вводить не обязательно. Турбо Ассемблер подразумевает в этом случае, что файл имеет расширение .asm.) На экране вы увидите следующее:

Редактирование

Исходный файл Ассемблера 1.asm

Ассемблирование

Объектный файл 1.obj

Компоновка

Выполняемый файл 1.exe

Выполнение

Если нужны изменения

Конец

Рис. 2. Редактирование, ассемблирование, компоновка и

выполнение программы

Turbo Assembler Version 2.0 Copyright (C) 1990 by Borland International Inc. (1)

Assembling file: 1.asm (2)

Error messages: None (3)

Warning messages: None (4)

Remaining memory: 266K (5)

(1) - Турбо Ассемблер, версия 2.0; авторские права фирмы Borland, 1990 г.;

(2) - ассемблирован файл 1.asm;

(3) - сообщения об ошибках: нет;

(4) - предупреждающие сообщения: нет;

(5) - остается памяти: 266К

Если ввести файл 1. asm как показано, то предупреждающих сооб-щений или сообщений об ошибках не будет. При наличии ошибок сооб-щения появляются на экране наряду с номерами строк, где содержатся ошибки. При получении сообщений об ошибках проверьте исходный код (текст) программы и убедитесь, что он выглядит точно так, как исход-ный код в примере, а затем снова ассемблируйте программу. После ус-пешного ассемблирования файла 1.asm выполнен только один шаг в про-цессе создания программы.

Для компоновки программы используется программа TLINK, пред-ставляющая собой поставляемый вместе с Турбо Ассемблером компо-новщик. Введите в командную строку:

TLINK exe.1 obj.

Не обязательно вводить расширение имени файла. TLINK по умол-чанию предполагает, что этим расширением является расширение obj. Когда компоновка завершится (самое большее через несколько секунд), компоновщик автоматически присвоит файлу с расширением exe имя, совпадающее с именем вашего объектного файла (если вы не опреде-лили другое имя). При успешной компоновке на экране появляется со-общение:

Turbo Linker Version 3.0 Copyright (c) 1987, 1990 by by Borland International Inc.

В процессе компоновки могут возникнуть ошибки (в данной про-грамме это маловероятно). При получении сообщения об ошибках ком-поновки (они выводятся на экран) измените исходный текст программы так, чтобы он в точности соответствовал тексту программы в приведен-ном выше примере, а затем снова выполните ассемблирование и ком-поновку. Вы получите новый файл 1 exe. Запустите его. На экран вы-ведется сообщение: 'Это строка результат выполнения программы'

Программа ТLINK, находящаяся в составе DOS, выполняет сле-дующее:

1.Завершает формирование в OBJ-модуле адресов, которые оста-лись неопределенными после ассемблирования.

2.Компонует, если необходимо, более одного отдельно ассемблиро-ванного модуля в одну загрузочную (выполнимую) программу. Воз-можно объединять две или более ассемблерных программ или ассемб-лерную программу с программами, написанными на языках высокого уровня, таких как Паскаль или Си.

3.Инициализирует EXE-модуль командами загрузки для выполне-ния.

После компоновки OBJ-модуля (одного или более) в EXE-модуль можно выполнить EXE-модуль любое число раз. Но, если необходимо внести некоторые изменения в EXE-модуль, следует скорректировать исходную программу, ассемблировать ее в другой OBJ-модуль и вы-полнить компоновку OBJ-модуля в новый EXE-модуль. Даже если эти шаги пока остаются непонятными, вы обнаружите, что, получив немного навыка, весь процесс подготовки EXE-модуля будет доведен до автоматизма.

Для выполнения программ можно также создавать COM-файлы. Примером часто используемого COM-файла является COMMAND.COM. Программа EXE2BIN.COM в DOS преобразует EXE- файлы в COM-файлы. Фактически эта программа создает BIN (двоичный) файл, поэтому она и называется "преобразователь EXE в Вin (EXE-to-BIN)". Выходной Вin-файл можно переименовать в COM-файл. Несмотря на то, что EXE2BIN преобразует EXE-файл в COM-файл, cуществуют определенные различия между программой, вы-полняемой как EXE-файл, и программой, выполняемой как COM-файл.

Размер программы. EXE-программа может иметь любой размер, в то время как COM-файл ограничен размером одного сегмента и не превышает 64К. COM-файл всегда меньше, чем соответствующий EXE-файл; одна из причин этого - отсутствие в COM-файле 512-байто-вого начального блока EXE-файла.

Сегмент стека. В EXE-программе определяется сегмент стека, в то время как COM-программа генерирует стек автоматически. Таким образом, при создании ассемблерной программы, которая будет пре-образована в COM-файл, стек должен быть опущен.

Сегмент данных. В EXE - программе обычно определяется сегмент данных, а регистр DS инициализируется адресом этого сегмента. В COM-программе все данные должны быть определены в сегменте кода.

Инициализация. EXE-программа записывает нулевое слово в стек и

инициализирует регистр DS. Так как COM-программа не имеет ни стека, ни сегмента данных, то эти шаги отсутствуют. Когда COM-про-грамма начинает работать, все сегментные регистры содержат адрес префикса программного сегмента (PSP), 256-байтового (100h) блока, который резервируется операционной системой DOS непосредственно перед COM или EXE программой в памяти. Так как адресация начина-ется со смещения 100H от начала PSP, то в программе после оператора SEGMENT кодируется директива ORG 100H.

Для программ в EXE и COM форматах выполняется ассемблирование для получения OBJ-файла и компоновка для получения EXE-файла. Если программа создается для выполнения как EXE-файл, то ее уже можно выполнить. Если же программа создается для выполнения как COM-файл, то компоновщиком будет выдано сообщение:

Warning: No STACK Segment (Предупреждение: Сегмент стека не определен)

Это сообщение можно игнорировать, так как определение стека в программе не предполагалось. Для преобразования EXE-файла в COM-файл используется программа EXE2BIN. Предположим, что EXE2BIN имеется на дисководе С, а скомпонованный файл по имени CALC.EXE - на дисководе B.

Введите EXE2BIN С:CALC,B:CALC.COM

Так как первый операнд всегда предполагает EXE файл, то можно не кодировать тип EXE.

Второй операнд может иметь другое имя (не CALC.COM). Если не указывать тип COM, то EXE2BIN примет по умолчанию тип BIN, кото-рый впоследствии можно переименовать в COM.

После того как преобразование будет выполнено, можно удалить OBJ- и EXE-файлы. Если исходная программа написана для EXE-формата, то можно, используя редактор, заменить команды в исходном тексте для COM - файла. Несоблюдение хотя бы одного требования COM-формата может послужить причиной неправильной работы про-граммы.

Если EXE2BIN обнаруживает oшибку, то выдается сообщение о не-возможности преобразования файла без указания конкретной причины. Необходимо проверить в этом случае директивы SEGMENT, ASSUME и END. Если опущен ORG 100H, то на данные в префиксе программного сегмента будут установлены неправильные ссылки с непредсказуемым результатом при выполнении. Попытка выполнить EXE-модуль про-граммы, написанной для COM-формата, не имеет успеха.

ЛАБОРАТОРНАЯ РАБОТА 1

СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА

И РАБОРА С ЭКРАНОМ МОНИТОРА

Цель работы - получить представление о структуре программы на языке Ассемблера, освоить процедуры работы с экраном.

Порядок выполнения работы

1.Рассмотреть стандартные процедуры работы с экраном.

1.1.Очистка экрана.

1.2. Управление цветом экрана.

1.3. Управление цветом выводимого символа.

1.4. Установка режима экрана.

1.5. Управление положением курсора

Программы на языке Ассемблера компонуются из набора как стандартных процедур, содержащихся в BIOS или DOS ПЭВМ, так и команд, написанных программистом. Следует стремиться к макси-мальному включению первой группы процедур в свои разработки и применению процедур, апробированных в предыдущих вариантах программ. В рамках лабораторных работ необходимо “переносить” фрагменты ранее разработанных процедур в новые программы, допол-няя их необходимыми инструкциями.

2.Определить структуру программы на языке Ассемблера: заголовок программы, назначить сегменты стека, данных и команд. Написать собственную процедуру и окончание программы.

Для выполнения можно воспользоваться имеющимся примером.

3.Составить стилизованную структуру, указав в каждой ее части необходимые команды. Состав собственной процедуры можно не указывать.

4.Составить и отладить процедуру изменения цвета экрана, вос-пользовавшись методическим материалом этой работы.

5.Составить процедуру, изменяющую цвет выводимых символов. Отладить процедуру.

6.Разработать процедуру установки режима экрана и определения координат курсора. Изменить положение выводимого символа или стро-ки на экране монитора.

7.Написать выводы по каждому пункту выполненной работы.

Большинcтво программ обеспечивают вывод данных в удобном формате на экран, принтер или диск. Данные, предназначенные для вывода на экран, имеют ASCII формат. Для выполнения вывода используется ко-манда INT (прерывание). Существуют различные требования для ука-зания транслятору какое действие (ввод или вывод) и на каком уст-ройстве необходимо выполнить. Все необходимые экранные операции можно выполнить, используя команду INT 10H, которая передает управление непосредственно в BIOS. Для выполнения некоторых более сложных операций существует прерывание более высокого уровня INT 21H, которое передает управление в DOS.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]