1 Отредактировано Voldemar0 (20-01-2018 20:49)

Тема: Диалоговый отладочный комплекс (ДОК, он же "Ассемблер") - Bug detected

Hi!

Я всегда считал ДОК безгрешным, так как ни одной ошибки никогда не встречал в нём, ни в 90-е, ни последние годы. Однако сегодня в девяточной версии (да и в семёрочной, наверняка, тоже вылезет) обнаружилась весьма гадская БАГА!

Смотрим внимательно:

http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=346&download=0

Какой адрес у меткок L2 и L3 ?
И почему, собственно ?

Ответ тут:

http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=347&download=0

Маленькая латинская буква в HEX-числе обрабатывается разными частями компилятора по разному - какой-то его блок (первый/второй проход ?) считает её недопустимой, в то время как другой - вполне корректной.

Вот только почти час ушел, пока я понял, что за чудеса творятся с прогой :(

Post's attachments

Attachment icon scr1.PNG 9.79 kb, 41 downloads since 2018-01-20 

Attachment icon scr2.PNG 5.17 kb, 38 downloads since 2018-01-20 

2

Re: Диалоговый отладочный комплекс (ДОК, он же "Ассемблер") - Bug detected

Ну что тут сказать.
Любая программа содержит N+1 ошибку, где N - число обнаруженных ошибок :)

3 Отредактировано USR (22-01-2018 02:59)

Re: Диалоговый отладочный комплекс (ДОК, он же "Ассемблер") - Bug detected

А у меня сегодня, просто листал файл в ассемблере, вдруг бац, и белиберда на экране плюс текстовый режим Apple. Правда не на реальной машине, в эмуляторе. И файл был на пределе размера буфера.

4

Re: Диалоговый отладочный комплекс (ДОК, он же "Ассемблер") - Bug detected

Я работал с семёрочным очень много, доводилось почти полный день сидеть без перезагрузки  - нормально работало всё. Заполнение мусором бывало только в случае отладки проги, когда это портило память редактора. Возможно, у девяточной версии добавили глюков.

5 Отредактировано Voldemar0 (11-02-2018 20:22)

Re: Диалоговый отладочный комплекс (ДОК, он же "Ассемблер") - Bug detected

Так-с.... Похоже, судьба у меня такая - все ошибки пересчитать.
Дело в том, что я до недавнего времени пользовался только семёрочным/140кб софтом для разработки. Сейчас попытался перейти на ИКП-based и ежедневно сталкиваюсь с какими-то косяками.

Сегодня рассматриваем команду [EXEC.
Эта команда позволяет в ДОК исполнить группу команд из текстового файла.
Более того, она рекомендуется к применению в составе древнего штатного линкера.
Только вот в ИКП она не срабатывает правильно.

Проверено в семёрочной версии 840, аналогичный код есть в девяточном ДОК.

При исполнении команды [EXEC открытие и закрытие текстового файла с командами выполняется примерно тут:

26D8 -   A9 00 ..   ")."    LDA   #00
26DA -   85 53 ..   ".s"    STA   53
26DC -   8D EE 04   ".Н."   STA   04EE
26DF -   20 D6 B8   ".V8"   JSR   B8D6   fopen
26E2 -   A9 F0 ..   ")П"    LDA   #F0
26E4 -   85 38 ..   ".."    STA   38
26E6 -   A9 26 ..   ")."    LDA   #26
26E8 -   85 39 ..   ".."    STA   39
26EA -   A9 46 ..   ")f"    LDA   #46
26EC -   8D F5 1B   ".У."   STA   1BF5
26EF -   60 .. ..   "ю"     RTS   

26F0 -   AD FE 04   "-Ч."   LDA   04FE   feof    IF (feof()) { getchar(); } ELSE { fclose(); reset(); };
26F3 -   D0 05 ..   "P."    BNE   26FA
26F5 -   A9 EE ..   ")Н"    LDA   #EE
26F7 -   4C E9 1B   "lИ."   JMP   1BE9   fread

26FA -   20 64 1B   ".д."   JSR   1B64   memsw
26FD -   20 34 BA   "..:"   JSR   BA34   fclose (shutfile)
2700 -   4C 00 20   "l.."   JMP   2000

fopen должна вернуть в ячейке $48 (filenum) номер открытого файла, что она успешно делает. При закрытии файла fclose должна получить этот же номер в той же ячейке. Однако, если вызванная сторонняя прога тоже открывает свои файлы, то значение этой ячейки портится, в результате чего fclose перекашивает изнутри (судя по всему, он не собирается проверять входные параметры и что-то пытается делать).

Он валит сообщение, например, о какой нибудь ошибке, но эта ошибка возвращает управление не в инициализацию сисмона, как задумано по адресу 2700 (jmp 2000), а куда-то ещё, в результате не корректируются вектора чтения символа и всё радостно залипает (чтение после конца файла).

Этой ошибки нет в старой семёрочной Школьнице (140кб):

26FA -   20 64 1B   ".д."   JSR   1B64
26FD -   A9 EE ..   ")Н"    LDA   #EE        <==
26FF -   85 48 ..   ".h"    STA   48
2701 -   20 34 BA   "..:"   JSR   BA34
2704 -   4C 00 20   "l.."   JMP   2000

Почему номер файла задаётся как константа, а не сохраняется от fopen
- дело тёмное, но оно работает. Если тоже самое проделать в ИКП-версии (тормознув исполнение и забив в отладчике нужное значение по адресу $48) - то всё тоже корректно срабатывает.