Язык ассемблера микропроцессора 8088. Константы с фиксированной запятой. Определение данных и распределение памяти, страница 7

MOV     CX,CODE1         число FFE2H как имя

MOV     DX,CODE2

MOV     SI,CODE       в) Неопределенное имя

RET                                           CODE

CODE1       DW        100

CODE2       DW         200

CODE3       DW         300 SECOND    ENDP

Ниже приведен образец правильной записи предыдущего примера. Символическое имя VALUE представлено 16-битовым внешним именем. Шестнадцате-ричная запись числа начинается с цифры и неправильно записанное имя CODE заменено на верное CODES.

SECOND  PROC    NEAR

EXTRN       VALUE: WORD

MOV            AX,CS

MOV            DS,AX

MOV            ES,AX

MOV            AX, VALUE

MOV            BX,OFFE2H

MOV            CX,CODEl

MOV            DX,CODE2

MOV            SI, CODE3 RET

CODE1       DW               100

CODE2       DW               200

CODE3       DW               300

SECOND    ENDP


Повторное определение символического имени

Макроассемблер формирует сообщение об ошибке повторного определения символического имени в тех случаях, когда одно и то же имя или метка два и более раз повторяются в поле метки ассемблерных утверждений программы.

Неверные записи

AX

CASEl

DX,BX

DX,00

CASE1

CASEl:      DEC LOOP

CMP JE

AND

Имя CASEl уже было определено

CASEl:

122


Правильная запись предыдущего примерам CASE1:      DEC      AX

LOOP    CASE1

AND      DX,BX

CMP      DX,00 CASE2:      JE,        CASE1

Ошибки выполнения программы как результат ошибок программирования

В языке ассемблера МП 8088 предусмотрена возможность определения меток и символических имен в конце программы, чтобы все используемые имена в программе могли быть сгруппированы в одном сегменте или процедуре. Такая практика программирования делает программы более доступными для понимания, так как определение всякого имени в программе можно быстро найти в процедуре или в сегменте, находящихся вблизи конца программы. Если команда ссылается на имя, которое определяется в программе позднее, тип этого имени (байт или слово) должен быть точно задан ассемблеру для правильной генерации машинных кодов.

Если никакой информации об определении типа символического имени нет, то ассемблер присваивает имени тип, который может оказаться некорректным. Это обстоятельство может привести к ошибке в процессе выполнения программы, хотя при трансляции программы сообщений об ошибках не будет; MOV NEXT_COUNT,12

Другие команды

RET  

NEXT_COUNT            DB ?

NEXT_CHECK           DB 100

Когда утверждение языка ассемблера MOV NEXT-COUNT, 12 транслируется в машинные коды, символическое имя NEXT_COUNT еще не определено. Ассемблер должен знать, представляется ли имя 'NEXT_COUNT байтом памяти или словом, чтобы он мог сгенерировать соответствующую последовательность машинных кодов (при этом генерируется 5 байт объектных кодов, если имя NEXT_COUNT

123


однобайтовое, или 6 байт, если имя двухбайтовое). Поскольку информация о символическом имени NEXT_COUNT, которая явно задает его тип, отсутствует, ассемблер воспринимает его как двухбайтовое (генерирует 6 байт объектных кодов), что оказывается в данном случае неверным.

Во время выполнения программы утверждение MOV NEXT_COUNT, 12 исказит содержимое однобайтовой ячейки памяти NEXT_CHECK. Этот тип ошибки очень труден для определения, поскольку отсутствуют какие-либо сообщения об ошибках при ассемблировании исходной программы. Чтобы быть уверенным в том, что тип имени NEXT-COUNT определен корректно, необходимо использовать директиву BYTE PTR:

MOV BYTE PTR NEXT_COUNT,12 Другие команды

RET

NEXT_COUNT DB ? NEXT_CHECK DB 100

Использование регистров

При использовании регистров для записи операндов в ассемблерной программе необходимо соблюдать следующие правила:

1.Нельзя задавать 8- и 16-разрядный регистры для записи двух операндов одной команды.

2.  Операции  со  стеком должны  осуществляться только в шестнадцатибитовых кодах. Если 8-разряд ный   регистр   указывают   для   работы   со   стеком (PUSH/POP), то выдается сообщение об ошибке.

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

ADD         AX,DL

PUSH              BL

ADD         DS,100

MOV       ES ,200

Неверные записи а) Одновременное использование

8-битового регистра (DL) и  16-битового регистра (АХ)

124