Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

6.2.7. Работа над синтаксическими ошибками при ассемблировании программы

Даже опытные программисты делают синтаксические ошибки при написании программы. Работа над допущенными в программе ошибками, также как и её написание, требует предварительного знакомства со следующими вопросами, которые выходят из рамок настоящего пособия:

  • запись ассемблерной строки с мнемокодом команды или директивой;

  • пользовательские и служебные идентификаторы. Имена, метки, переменные;

  • форматы данных и директивы их инициализации в памяти (db, dw, dd,...).

  • макроопределения символьных констант, выражений и строк (директивы = и equ);

  • константные и адресные выражения;

  • общее знакомство с командами процессоров i80x86.

Здесь ограничимся указанием перечня наиболее часто допускаемых ошибок при написании первых программ, наличие которых (с указанием номера строки) будет отмечено Tasm при ассемблировании:

  • искажение имени команды или директивы;

  • опущено двоеточие ':' после имени метки;

  • неправильная запись пользовательского идентификатора;

  • в качестве оператора содержится неопределённый ранее идентификатор;

  • использование имени служебного идентификатора в качестве пользовательского;

  • значение инициализируемой константы превышает допустимую величину, например:

db 400 ;400 > 255, т. е. максимального значения в формате byte

  • наличие запятой в конце списка элементов при множественной инициализации, например:

Dw 1,3,5,400, ;лишняя запятая в конце списка

  • отсутствие круглых скобок в операторе dup, например:

Db 4 dup 7 ;надо "4 dup (7)"

  • ошибка в написании имени модели памяти или её отсутствие при использовании упрощенных директив;

  • опущена одна или обе квадратные скобки [], заключающие адресное выражение в режиме Ideal, например:

Mov ax, [bx+si ;содержимое по адресу bx+si отправить в ax

  • не совпадают типы операндов, с которыми оперирует команда, например:

Mov al,[var_w] ;ошибка, – ранее переменная var_w была определена в формате word

Mov ax,[var_b] ;ошибка, – ранее переменная var_b была определена в формате byte

  • требуется явно указать тип операнда, например:

Mov [bx],1 ;ошибка, – надо явно указать тип ячейки памяти: [byte bx] или

;[word bx] и. т. п.

  • операнд в текущей инструкции не может быть ссылкой на адрес памяти:

Mov [oper_1],[oper_2] ;ошибка, – инструкция mov не может передавать данные из

;одной ячейки памяти в другую

  • недопустимый режим адресации, например:

Add [dx+si],ax ;ошибка, – регистр dx не может быть использован в косвенной

;адресации

  • недопустимая команда для выбранного в настоящий момент типа процессора. По умолчанию используется i8086;

  • адрес назначения в команде условного перехода находится вне допустимого для процессора i8086 диапазона, т. е. не принадлежит интервалу (– 128, + 127);

  • непарное использование директивы endp, например:

Proc addition

...........

endp subtraction ; ошибка, -должно быть указано имя процедуры addition

Аналогичные ошибки могут быть допущены и при использовании других парных директив "segment <name> ... ends <name>", "macro <name> .... endm <name>" и. т. п.

  • в конце программы отсутствует директива End.

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