Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Gl10.doc
Скачиваний:
26
Добавлен:
20.05.2014
Размер:
104.96 Кб
Скачать

10.5. Сообщения tasm об ошибках

При вызове tasm для трансляции first.asm выдаются следующие сообщения.

D:\ >tasm first.asm

Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: first.asm

Error messages: None

Warning messages: None

Passes: 1

Remaining memory: 388k

Сначала выводится номер версии Асссемблера. В пакет TASM 5.0 входит ассемблер tasm.exe версии 4.1. Далее сообщается, какой файл ассемблируется (позднее мы увидим, что за один вызов tasm можно ассемблировать несколько файлов, поэтому вовсе не лишней является информация, какой именно файл обрабатывается). Для этого файла в следующих двух строках выдается информация, что ошибок и предупреждений нет. Далее сообщается, что по тексту программы сделан один проход. Последнее сообщение информирует, сколько оперативной памяти осталось свободной при ассемблировании.

Перечислим возможные типы ошибок и предупреждений. Для этого намеренно будем вносить в файл ошибки.

1. Удалим директиву END start (проще всего закомментировать ее, поставив перед ней точку с запятой).

Assembling file: first.asm

**Fatal** first.asm(15) Unexpected end of file encountered

Error messages: 1

Выдается тип ошибки (Fatal — грубая), в скобках указан номер строки файла, где встретилась ошибка (15), далее — диагностическое сообщение: "Неожиданно встречен конец файла". При этом не создается объектный файл и не создается файл с листингом (при наличии ключа /l).

Восстановим директиву END start.

2. Удалим запятую, разделяющую операнды, в команде mov ah,9h

**Error** first.asm(8) Undefined symbol: AH9H

*Warning* first.asm(8) Argument needs type override

Error messages: 1

Warning messages: 1

На этот раз файл листинга есть, но объектный файл по-прежнему отсутствует. Сообщение об ошибке: "Неопределенный символ AH9H". Как видите, сообщение не проясняет происхождение ошибки. К этой же строке делается предупреждение: аргумент требует переопределения типа. Это даже комментировать не будем. Восстановите запятую.

3. Добавим перед директивой END start строку mov ax,[200h].

*Warning* first.asm(13) [Constant] assumed to mean immediate constant

Error messages: None

Warning messages: 1

На этот раз создается и файл с листингом и объектный файл. Но к предупреждениям нужно относиться внимательно и настороженно. В отладчике мы увидим строку:

1AB7:0011 B80002 MOV AX,0200

Это вовсе не соответствует нашему замыслу: поместить в регистр AX содержимое ячейки со смещением 200. Предупреждение на этот раз было точным: Константа, заключенная в квадратные скобки, предполагается константой — непосредственным операндом. Как исправить эту ошибку? Нужно использовать префикс замены сегмента: mov ax, ds:[200h]. Тогда мы увидим в отладчике:

1AB7:0011 A10002 MOV AX,[0200]

Префикс для DS: в коде, конечно, отсутствует.

10.6. Карта памяти

Файл с картой памяти возникает при вызове компоновщика.

Start Stop Length Name Class

00000H 00010H 00011H _TEXT CODE

00020H 00028H 00009H _DATA DATA

00030H 0012FH 00100H STACK STACK

Program entry point at 0000:0000

Для каждой программной секции определен начальный адрес (Start), конечный адрес (Stop), длина в байтах (Length), имя (Name) и класс (Class). Указан стартовый адрес (Program entry point). Адреса, указанные в Start, будут приплюсованы к адресу загрузки программы. Этот адрес задает загрузчик — компонента операционной системы программа command.com

10.7. Сообщения TLINK об ошибках

Так же как и TASM компонвщик выдает сообщения об ошибках трех типов: Fatal, Error, Warning. Приведем два примера.

Изменим в программе first.asm последнюю строку:

END ; start

Трансляция пройдет без замечаний. А компоновщик выдаст сообщение об ошибке:

Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International

Fatal: No program entry point (в программе нет стартового адреса)

Восстановим последнюю строку (END start) и закомментируем строку .STACK 100h. На этот раз получим предупреждение:

Warning: No stack

10.8. Запуск программы на выполнение

При запуске exe-файла на выполнение в ОЗУ образуется два блока памяти. В первом блоке расположены переменные окружения (enviroment). Например, там находятся строки PATH из autoexec.bat.

Второй блок (в котором и находится программа) состоит из двух частей. Сначала в памяти расположен так называемый префикс программного сегмента (PSP — program segment prefix). Его размер составляет ровно 256 = 100h байт. Далее располагается код и данные самой программы.

PSP в свою очередь состоит из двух частей. В его первой половине система размещает некоторую служебную информацию, к которой можно обращаться из самой программы. Например, по определенному смещению внутри PSP находится адрес блока окружения. Вторая половина PSP начинается со смещения 80h (именно половина: 80h + 80h = 100h). Она содержит хвост командной строки. Речь об этом пойдет ниже.

После загрузки программы в ОЗУ сегментные регистры содержат фиксированные адреса. В CS находится адрес сегмента кода программы, в SS — адрес сегмента стека программы. Они уже настроены нужным образом. А вот DS и ES содержат сегментный адрес PSP. Именно поэтому первые две выполняемые команды в exe-программе такие:

start: mov ax, @data

mov ds, ax

После этого DS содержит сегментный адрес данных (более точно: сегментный адрес группы, включающей сегмент данных и сегмент стека). ES продолжает показывать на PSP.

Соседние файлы в папке Лекции