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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.