#1
                
                04 января 2009 в 13:01
                
                
            
            
                Нужен отладчик DOS-программ (16 бит) для Vista 32бита. <br />Просто, td.exe у меня пару раз crashed и это напрягает... <br /><br />Нужно тестировать код на ассемблере, будь он неладен  ;D <br />Главное, что навело меня на мысль о НЕсовместимости: <br />- программа рушится на совершенно "безобидном" участке кода, а Vista пишет: <br />
            
        <br /><br />- EventData <br /><br />   16 bit MS-DOS Subsystem <br />   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. <br />...и приблизительно такое же пишет когда я пытаюсь прогнать программу до нужного мне места (клавиша F4)<br /><br />П.С.: попробую гонять это чудо под DOSBOX. <br />П.П.С.: забавно... отладчик TD.EXE запустился под DOSBOX, но изменения в памяти не показывает, а когда я установил курсор на предпоследней строке и нажал F4 (выполнить до указанного места) DOSBOX намертво завис... Вот так...
            
            
            
                
                    #2
                
                05 января 2009 в 19:13
                
                
            
            
                Что за прога?<br /><br />Не хочешь поставить виртуальную машину?<br />Ставишь туда какую угодно Ось, лишь бы отладчик запустился. И отлаживаешь скока угодно  ;)<br />
            
            
        
            
            
                
                    #3
                
                05 января 2009 в 19:14
                
                
            
            
                И что за "безобидный участок кода"?
            
            
        
            
            
                
                    #4
                
                05 января 2009 в 20:25
                
                
            
            
                Берсеркер<br />Vm player стоит, но я толком не умею им пользоваться. <br />А код такой: <br />
            
        <br />;Одна из домашек - найти и записать в массив все простые числа до 255<br />;save inside array called PRIMES all the prime numbers that can be contained in BYTE<br />;2, 3, 5, 7, 11, 13, 17, 19, 23, 29 and so on...<br />dannie	segment<br />	PRIMES	db 64h dup(?) ;размер массива определил "на глаз"<br />dannie	ends<br />vasya	segment<br />	assume cs:vasya, ds:dannie<br />begin:<br />	mov	ax, dannie<br />	mov	ds, ax<br />;---------------------------------<br />	mov	bx, 0 <br />	mov	dh, 2<br />cycle1: <br />	mov	dl, 2<br />	cmp	dh, dl<br />	je	save<br />cycle2:<br />	sub	ax, ax<br />	mov	al, dh<br />	div	dl<br />	cmp	ah, 0<br />	je	notprime<br />	inc	dl <br />	cmp	dl, dh <br />	jb	cycle2<br />save:<br />	mov	PRIMES[bx], dh<br />	inc	bx <br />notprime:<br />	inc	dh <br />	cmp	dh, 0ffh<br />	jbe	cycle1 ; возможно, лажа происходит здесь: в конце: dh == 255? да, ещё один прогон dh++, dh == 0... вроде, бесконечного цикла... <br />;---------------------------------<br />	mov	ah, 4ch<br />	int	21h<br />vasya	ends<br />end	begin<br />Кстати, я заметил, что вылеты происходят не в одном конкретном месте... картина усложняется
            
            
            
                
                    #5
                
                06 января 2009 в 05:34
                
                
            
            
                Ну понятное дело, массив PRIMES у тебя лежит до кода, и если прога зацикливается, BX нарастает и залезает на код.<br />Происходит порча код, имеем ошибку при выполнении хз какой инструкции   :D<br />Сделай так:<br />1. перенеси PRIMES в конец кода, уж если и вылезет за пределы, то код не убъёт. Но это параноидальная мера, в принципе не нужная, если сделаешь п.2<br />2. Если размер PRIMES равен 64, при инкременте BX проверяй, если он = 64, то завершай работу.<br />PS: код легче читается если ставить пробелы, например не incdh , а inc dh  ;)  (похоже форум TAB хавает  :( )<br />И вот что я еще заметил:<br />cmp dh, 0ffh<br />jbe cycle1;  этот переход не выполнится никогда, т.к. простое число до 255 еще запомнится, а простое большее чем 255 - тоже не найдем, т.к. перейдет циклический переход с 255 на 0.
            
            
        
            
            
                
                    #6
                
                06 января 2009 в 06:15
                
                
            
            
                Короче, код не красив в плане контроля выхода за пределы массива.<br />Сделай выход из цикла при переполнении массива ИЛИ получения простого числа больше 255, для этого используй 16-битный регистр.
            
            
        
            
            
                
                    #7
                
                06 января 2009 в 08:03
                
                
            
            
                Берсеркер<br />Какой браузер юзаешь? У меня всё нормально отображается в плане пробелов и табуляции. (таб выглядит как пробел)<br /><br />Я просто сделаю вместо: <br />
            
        И вот что я еще заметил:<br />cmp dh, 0ffh<br />jbe cycle1;  этот переход не выполнится никогда<br />cmp dh, 0ffh<br />jb cycle1<br />...потому как 255 не является простым и не буду мозги парить умным людям  ;) <br />Тестировать наверное не буду, потому как всплыла новая, гораздо более серъёзная задача. <br /><br />Кстати, не знаешь нормального дэбаггера DOS-программ для Vista 32 бита? <br />ОллиДэбаг не работает с 16 битными прогами, SOftICE тоже, я пробовал несколько версий - не дружит с Вислой. <br />Также, пробовал несколько разных версий Turbo Debugger'а и они тоже как-то не совсем удачно возвращают управление cmd. <br /><br />Возможно самый совместимый это встроенный в ОС debug, но я им пользоватся не умею, довольно жуткая программа...
            
            
                
                    #8
                
                06 января 2009 в 11:45
                
                
            
            
                юзаю в данный момент IE<br /><br />
            
        этот переход не выполнится никогда<br />- это я опечатался, правильно будет "не выйдет из цикла"  :-[<br /><br />
cmp dh, 0ffh<br />jb cycle1<br />Тут тоже бессмыслица, потому как в DH больше чем 0ffh не загнать!<br />
Тестировать наверное не буду, потому как всплыла новая, гораздо более серъёзная задача.<br />Вопрос закрыт?<br /><br />Под Вислу не знаю софта  :( я на XP64 сижу.<br />Из молодости вспоминается отладчик TIC (в девичестве AFD), легче чем TD. Но это тоже 16-битная прога, тоже наверняка будет некорректно выходить в cmd. Этим страдают многие 16-битные проги, запущенные в XP (и Vista?)<br /><br />
            
            
                
                    #9
                
                06 января 2009 в 12:57
                
                
            
            
                Берсеркер<br />
<br /><br />П.П.С.: turbo debugger я "сдал в утиль" и теперь пользуюсь более достойным и более мобильным (бесплатный проэкт) INSIGHT версии 123. Даже клавиши как в td. Ещё я поюзал немного AFD pro, но он мне понравился меньше. <br /><br />Плюсы INSIGHT: расположение клавиш (функций) отладчика как в td, не требует для запуска доп. модулей как например td, почти исправно возвращается в cmd ("забывает" очистить экран, делаем вручную cls - и порядок). Минус - в окне отладчика не работает мышка. Всем реккомендую. <br /><br />
            
        юзаю в данный момент IE<br />У меня же - Мozilla Firefox 3.0.5 <br />
- это я опечатался, правильно будет "не выйдет из цикла"<br />Не имеет значения - я тебя правильно понял. <br />
Цитировать<br />cmp dh, 0ffh<br />jb cycle1<br />Тут тоже бессмыслица, потому как в DH больше чем 0ffh не загнать!<br />Ага, но когда там будет ff условие cmp dh, 0ffh а потом jb cycle1 не сработает (вернее сработает NOP где-то в глубинах процессора), и прыжка не будет. Mission accomplished. <br />
Вопрос закрыт?<br />Я всё-таки ещё потестирую, но думаю больше сложностей в этом примере не возникнет. <br />Всё равно препод потом скажет как этот код укоротить раза в два  ;D <br />
Из молодости вспоминается отладчик TIC<br />Интересно... поищу, попробую. <br /><br />Спасибо  :)<br /><br />П.С.: рано я расслабился - теперь вылетает на первой же строке кода: <br />
http://www.bttr-software.de/products/insight/<br />Судя по именам, большая часть разработчиков - выходцы СНГ. 
            
            
            
                
                    #10
                
                06 января 2009 в 15:31
                
                
            
            
                Ух ёпс (сказал я глядя на скрин).<br />Прога еще не начала выполняться, а уже крэш.<br />В проге код: B8 BB 17<br />А в крэш-отчете: FF FF 00 FF FF - явно левый код.<br />Похоже на обычный глюк старой 16-битной проги в среде XP/Vista.<br />TD фтопку!<br /><br />INSIGHT - надодь поглядеть  ::) сенкс.<br />
            
        Судя по именам, большая часть разработчиков - выходцы СНГ.<br />Ну дык полна земля славянская талантами  ;)