Welcome, guest. You can be a Login или register
« Previous 1 2 Next » | All
Author
Topic title
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
Нужен отладчик DOS-программ (16 бит) для Vista 32бита.
Просто, td.exe у меня пару раз crashed и это напрягает...

Нужно тестировать код на ассемблере, будь он неладен ;D
Главное, что навело меня на мысль о НЕсовместимости:
- программа рушится на совершенно "безобидном" участке кода, а Vista пишет:


- EventData

16 bit MS-DOS Subsystem
C:\Windows\system32\cmd.exe The NTVDM CPU has encountered an illegal instruction. CS:94e8 IP:0e5e OP:63 72 6f 73 6f Choose 'Close' to terminate the application.

...и приблизительно такое же пишет когда я пытаюсь прогнать программу до нужного мне места (клавиша F4)

П.С.: попробую гонять это чудо под DOSBOX.
П.П.С.: забавно... отладчик TD.EXE запустился под DOSBOX, но изменения в памяти не показывает, а когда я установил курсор на предпоследней строке и нажал F4 (выполнить до указанного места) DOSBOX намертво завис... Вот так...
Берсеркер
Offline
Суровый челябинский программист
2266 posts
Karma 201
Что за прога?

Не хочешь поставить виртуальную машину?
Ставишь туда какую угодно Ось, лишь бы отладчик запустился. И отлаживаешь скока угодно ;)
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
Offline
Суровый челябинский программист
2266 posts
Karma 201
И что за "безобидный участок кода"?
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
Берсеркер
Vm player стоит, но я толком не умею им пользоваться.
А код такой:

;Одна из домашек - найти и записать в массив все простые числа до 255
;save inside array called PRIMES all the prime numbers that can be contained in BYTE
;2, 3, 5, 7, 11, 13, 17, 19, 23, 29 and so on...
dannie segment
PRIMES db 64h dup(?) ;размер массива определил "на глаз"
dannie ends
vasya segment
assume cs:vasya, ds:dannie
begin:
mov ax, dannie
mov ds, ax
;---------------------------------
mov bx, 0
mov dh, 2
cycle1:
mov dl, 2
cmp dh, dl
je save
cycle2:
sub ax, ax
mov al, dh
div dl
cmp ah, 0
je notprime
inc dl
cmp dl, dh
jb cycle2
save:
mov PRIMES[bx], dh
inc bx
notprime:
inc dh
cmp dh, 0ffh
jbe cycle1 ; возможно, лажа происходит здесь: в конце: dh == 255? да, ещё один прогон dh++, dh == 0... вроде, бесконечного цикла...
;---------------------------------
mov ah, 4ch
int 21h
vasya ends
end begin

Кстати, я заметил, что вылеты происходят не в одном конкретном месте... картина усложняется
Берсеркер
Offline
Суровый челябинский программист
2266 posts
Karma 201
Ну понятное дело, массив PRIMES у тебя лежит до кода, и если прога зацикливается, BX нарастает и залезает на код.
Происходит порча код, имеем ошибку при выполнении хз какой инструкции :D
Сделай так:
1. перенеси PRIMES в конец кода, уж если и вылезет за пределы, то код не убъёт. Но это параноидальная мера, в принципе не нужная, если сделаешь п.2
2. Если размер PRIMES равен 64, при инкременте BX проверяй, если он = 64, то завершай работу.
PS: код легче читается если ставить пробелы, например не incdh , а inc dh ;) (похоже форум TAB хавает :( )
И вот что я еще заметил:
cmp dh, 0ffh
jbe cycle1; этот переход не выполнится никогда, т.к. простое число до 255 еще запомнится, а простое большее чем 255 - тоже не найдем, т.к. перейдет циклический переход с 255 на 0.
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
Offline
Суровый челябинский программист
2266 posts
Karma 201
Короче, код не красив в плане контроля выхода за пределы массива.
Сделай выход из цикла при переполнении массива ИЛИ получения простого числа больше 255, для этого используй 16-битный регистр.
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
Берсеркер
Какой браузер юзаешь? У меня всё нормально отображается в плане пробелов и табуляции. (таб выглядит как пробел)

Я просто сделаю вместо:
И вот что я еще заметил:
cmp dh, 0ffh
jbe cycle1; этот переход не выполнится никогда

cmp dh, 0ffh
jb cycle1
...потому как 255 не является простым и не буду мозги парить умным людям ;)
Тестировать наверное не буду, потому как всплыла новая, гораздо более серъёзная задача.

Кстати, не знаешь нормального дэбаггера DOS-программ для Vista 32 бита?
ОллиДэбаг не работает с 16 битными прогами, SOftICE тоже, я пробовал несколько версий - не дружит с Вислой.
Также, пробовал несколько разных версий Turbo Debugger'а и они тоже как-то не совсем удачно возвращают управление cmd.

Возможно самый совместимый это встроенный в ОС debug, но я им пользоватся не умею, довольно жуткая программа...
Берсеркер
Offline
Суровый челябинский программист
2266 posts
Karma 201
юзаю в данный момент IE

этот переход не выполнится никогда

- это я опечатался, правильно будет "не выйдет из цикла" :-[

cmp dh, 0ffh
jb cycle1

Тут тоже бессмыслица, потому как в DH больше чем 0ffh не загнать!
Тестировать наверное не буду, потому как всплыла новая, гораздо более серъёзная задача.

Вопрос закрыт?

Под Вислу не знаю софта :( я на XP64 сижу.
Из молодости вспоминается отладчик TIC (в девичестве AFD), легче чем TD. Но это тоже 16-битная прога, тоже наверняка будет некорректно выходить в cmd. Этим страдают многие 16-битные проги, запущенные в XP (и Vista?)

Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
Берсеркер
юзаю в данный момент IE

У меня же - Мozilla Firefox 3.0.5
- это я опечатался, правильно будет "не выйдет из цикла"

Не имеет значения - я тебя правильно понял.
Цитировать
cmp dh, 0ffh
jb cycle1
Тут тоже бессмыслица, потому как в DH больше чем 0ffh не загнать!

Ага, но когда там будет ff условие cmp dh, 0ffh а потом jb cycle1 не сработает (вернее сработает NOP где-то в глубинах процессора), и прыжка не будет. Mission accomplished.
Вопрос закрыт?

Я всё-таки ещё потестирую, но думаю больше сложностей в этом примере не возникнет.
Всё равно препод потом скажет как этот код укоротить раза в два ;D
Из молодости вспоминается отладчик TIC

Интересно... поищу, попробую.

Спасибо :)

П.С.: рано я расслабился - теперь вылетает на первой же строке кода:


П.П.С.: turbo debugger я "сдал в утиль" и теперь пользуюсь более достойным и более мобильным (бесплатный проэкт) INSIGHT версии 123. Даже клавиши как в td. Ещё я поюзал немного AFD pro, но он мне понравился меньше.

Плюсы INSIGHT: расположение клавиш (функций) отладчика как в td, не требует для запуска доп. модулей как например td, почти исправно возвращается в cmd ("забывает" очистить экран, делаем вручную cls - и порядок). Минус - в окне отладчика не работает мышка. Всем реккомендую.

http://www.bttr-software.de/products/insight/
Судя по именам, большая часть разработчиков - выходцы СНГ.
Берсеркер
Offline
Суровый челябинский программист
2266 posts
Karma 201
Ух ёпс (сказал я глядя на скрин).
Прога еще не начала выполняться, а уже крэш.
В проге код: B8 BB 17
А в крэш-отчете: FF FF 00 FF FF - явно левый код.
Похоже на обычный глюк старой 16-битной проги в среде XP/Vista.
TD фтопку!

INSIGHT - надодь поглядеть ::) сенкс.
Судя по именам, большая часть разработчиков - выходцы СНГ.

Ну дык полна земля славянская талантами ;)
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
« Previous 1 2 Next » | All