Исправление ошибок програмны TASM з.о
(С) Константин Макаров,
г.Чебоксары, 1995.
Ассемблер TASM 3.0, распространяемый ИНФОРКОМом, очень удобен в работе, имеет приличный набор функций, облегчающих написание программ. Но некоторыми функциями невозможно пользоваться из-за ошибок, не выявленных тестированием. Цель этой статьи - дать возможность пользователям сделать полностью работоспособную версию, не дожидаясь сей милости от автора программы.
Теперь об ошибках. Принципиальных - две: не работает команда "Merge" и некорректно обрабатывается длина объектного кода, когда встречается команда "INCBIN". Во втором случае нормально работает команда "Run", но "Object save" выгружает на диск сгенерированную программу не полностью.
Для внесения изменений пришлось пожертвовать фрагментами текстовых сообщений, так "Merging file:" превратилось в "Merging", a "Import TASM 2.0 source file:" в просто "TASM 2.0 f i4le: " .
Ошибка "Merge" возникала из-за того, что при вызове процедуры чтения файла регистр DE - указатель длины подгружаемого текста всегда содержал 65535, что приводило к перекрытию рабочего кода, после чего программа зависала. Процедура, реализующая это, приведена в листинге 1.
Листинг 1. Первоначальный текст программы.
55311 CALL 34122 ;Печать
;сообщения.
55314 DEFB 13
55315 DEFM "Merging file"
;Признак конца. ;Ввод имени ;файла.
;Поиск файла.
55328 DEFB 0
55329 CALL 38308
55332 LD C,10 55334 CALL 34137
Эту процедуру пришлось переписать и добавить туда чтение информации о файле, что необходимо для нормальной работы программы (листинг 2).
Листинг 2.
ЧИТАТЕЛЬ - ЧИТАТЕЛЮ
55337 |
BIT |
7,С |
;Проверка: |
|
|
Листинг 3. |
|
|
|
|
;есть/нет. |
|
|
|
|
55339 |
LD |
A, 1 |
|
Фрагмент программы. |
реализую- |
55341 |
LD |
(23823) ,A |
|
щий увеличение счетчиков на длину |
55344 |
RET |
NZ |
;Возврат, |
подгружаемого файла. |
|
|
|
|
;если нет. |
|
|
|
|
55345 |
LD |
HL,39221 |
;Начало |
50953 |
LD |
HL,(49214) |
|
|
|
|
;текста. |
50956 |
LD |
(23307),HL |
|
55348 |
CALL |
38361 |
;Поиск конца. |
50959 |
LD |
DE,(23784) |
;B DE - |
55351 |
PUSH |
HL |
|
|
|
;длина файла. |
55352 |
LD |
DE,65535 |
;Зачем - |
50963 |
ADD |
HL,DE |
|
|
|
|
;- непонятно. |
50964 |
LD |
(49214),HL |
|
55355 |
LD |
A,3 ;При A=3 длина |
50967 |
LD |
HL,(49221) |
|
55357 |
LD |
С,14 ;загрузки в DE. |
50970 |
ADD |
HL,DE |
|
55359 |
CALL |
34137 ;Загрузка файла. |
50971 |
LD |
(49221),HL |
|
55362 |
DP |
38262 |
|
50974 |
LD |
A,(49216) |
|
Исправленный текст программы.
55311 |
CALL |
34122 |
|
55314 |
DEFB |
13 ' |
|
55315 |
DEFM |
"Merging " |
55323 |
NOP |
NOP : |
NOP |
55326 |
CALL |
38308 |
|
55329 |
LD |
C,10 |
|
55331 |
CALL |
34137 |
|
55334 |
BIT |
7,С |
|
55336 |
RET |
NZ |
|
55337 |
LD |
А,С ;B |
А -номер файла. |
55338 |
LD |
С, 8 |
|
55340 |
CALL |
15635 ; |
Чтение. |
55343 |
LD |
A, 1 |
|
55345 |
LD |
(23823) |
, A |
55348 |
LD |
HL,39221 |
55351 |
CALL |
38361 |
|
55354 |
PUSH |
HL |
|
55355 |
LD |
A,255 ; |
При A=255 длина |
55357 |
LD |
С, 14 ; |
загрузки берет |
|
|
|
ся из каталога. |
55359 |
CALL |
34137 ; |
Загрузка -файла. |
55362 |
JP |
38262 |
|
Ошибка "INCBIN" связана с тем, что при подкачке файлов во время трансляции длина генерируемого объектного кода, которая хранится в ячейках 38569/38570 не увеличивалась на длину подгружаемого файла (листинг 3).
Этот дефект исправляется написанием подпрограммы, реализующей эту операцию (листинг 4).
Листинг 4.
Подпрограмма увеличения переменной, отвечающей за длину выг-
рузки |
объектного кода. |
50974 |
CALL |
38681 ; что эквива |
|
|
;лентно 55065 в не |
|
|
;развернутом файле |
55065 |
LD |
HL,(38569) |
55068 |
ADD |
HL,DE |
55069 |
LD |
(38569),HL |
55072 |
LD |
А,(49216) ;Команда, |
|
|
;ранее находящаяся |
|
|
;по адресу 50974. |
55075 |
RET |
|
Для внесения изменений необходимо загрузить файл "ТА§М3.0-" CODE по адресу 49152. Это начальный адрес загрузки, после которой файл разворачивается в памяти. Но мы будем работать с неразвернутым кодом, для которого и приведены адреса в листингах.
После загрузки любым монитором (очень удобно использовать STS 2 6) следует внести исправления согласно листингу 5 (на следующей странице), -после чего выгрузить на диск файл с адреса 49152 длиной 10448 байт. Лучше не оставлять 'ему прежнее имя, а назвать его "TASM3. 1" .