Консультация № 16395
29.01.2005, 00:05
0.00 руб.
0 5 5
Есть следующий пример, взятый из книги Питера Абеля "Ассемблер: язык и программирование для IBM PC". В результате должна появиться таблица ASCII. На ВинХР (десктоп с ЭЛТ монитором) все нормально, но на ноутбуке почему-то выполнение данной программы приводит к полному зависанию, и спасает только перезагрузка. Почему так получается?

Приложение:
TITLE A09BIOAS (EXE) INT 10H to display ASCII character set .MODEL SMALL .STACK 64 .DATACHAR_CTR DB 00 ;Counter for ASCII charactersCOL DB 24 ;Column of screenROW DB 04 ;Row of screenMODE DB ? ;Video mode.286 ;----------------------------------------------------------- .CODEA10MAIN PROC NEAR MOV AX,@DATA ;Initialize MOV DS,AX ; segment MOV ES,AX ; registers CALL B10MODE ;Get/set video mode CALL C10CLEAR ;Clear screenA20: CALL D10CURSOR ;Set cursor CALL E10DISPLY ;Display characters CMP CHAR_CTR,0FFH ;Last character displayed? JE A30 ; yes, exit INC CHAR_CTR ;Increment char. counter ADD COL,02 ;Increment column CMP COL,56 ;At end of column? JNE A20 ; no, bypass INC ROW ; yes, increment row MOV COL,24 ; and reset column JMP A20A30: MOV AH,10H ;Request get character INT 16H ; from keyboard MOV AH,00H ;Request reset mode MOV AL,MODE ; to original value INT 10H MOV AX,4C00H ;End of processing INT 21HA10MAIN ENDP; Get and save current mode, set new mode:; ---------------------------------------B10MODE PROC NEAR MOV AH,0FH ;Request get mode INT 10H MOV MODE,AL ;Save mode MOV AH,00H ;Request set new mode MOV AL,03 ;Standard color INT 10H RETB10MODE ENDP; Clear screen, create window, set attribute:; ------------------------------------------C10CLEAR PROC NEAR PUSHA ;Preserve general registers MOV AH,08H ;Request get current INT 10H ; attribute in AH MOV BH,AH ;Move it to BH MOV AX,0600H ;Scroll whole screen MOV CX,0000 ;Upper left location MOV DX,184FH ;Lower right location INT 10H MOV AX,0610H ;Create 16-line window MOV BH,16H ;Blue backgrd, brown foregrd MOV CX,0418H ;Upper left corner 04:24 MOV DX,1336H ;Lower right corner 19:54 INT 10H POPA ;Restore registers RETC10CLEAR ENDP; Set cursor to row and column:; ----------------------------D10CURSOR PROC NEAR PUSHA ;Preserve general registers MOV AH,02H ;Request set cursor MOV BH,00 ;Page 0 (normal) MOV DH,ROW ;New row MOV DL,COL ;New column INT 10H POPA ;Restore registers RETD10CURSOR ENDP; Display ASCII characters one at a time:; --------------------------------------E10DISPLY PROC NEAR PUSHA ;Preserve general registers MOV AH,0AH ;Request display MOV AL,CHAR_CTR ;ASCII character MOV BH,00 ;Page 0 MOV CX,01 ;One character INT 10H POPA ;Restore registers RETE10DISPLY ENDP END A10MAIN

Обсуждение

Неизвестный
29.01.2005, 00:34
общий
это ответ
Здравствуйте, Самновский Ярослав Юрьевич!
Похоже на то, что у тебя видеокарта по int10 виснет, попробуй сменить видеорежим или посмотри в TurboDebugger‘e или что там у тебя - где виснет.
Неизвестный
29.01.2005, 03:32
общий
это ответ
Здравствуйте, Самновский Ярослав Юрьевич!
Действительно нужно проитись дебаггером по проге чтобы определить место где виснет.
Если нет дебагера (желания, возможности, умения), можно просто вставлять INT20h (MOV Ah,4CH INT 21H) сначала перед первым int10h, затем перед вторым и так далее. Пока не найдете INT который зависает.
Единственное что приходит на ум - ноут не поддерживает режим 40х25... Ноут не монохромный? Какой проц? Какая видюха, откуда запускаете (DOS, Win98, WinXP)?
Неизвестный
29.01.2005, 14:00
общий
это ответ
Здравствуйте, Самновский Ярослав Юрьевич!
Ноутбук совметимый со стандартом ! , т.е. не Apple!
Прочитайте расширенную документацию по процессору и биосу!
Неизвестный
30.01.2005, 21:09
общий
это ответ
Здравствуйте, Самновский Ярослав Юрьевич!
<font color=#808080><i>
> взятый из книги Питера Абеля "Ассемблер: язык и программирование для IBM PC"
</font><font color=#000000></i>
Вам не кажется, что программирование под MS-DOS в наше время не имеет смысла?
</font><font color=#808080><i>
> I. На ВинХР (десктоп с ЭЛТ монитором) все нормально, но на ноутбуке

</font><font color=#000000></i>Какая ОС на ноутбуке? Какая видеокарта? Возможно, ошибки в BIOS видеокарты, а конкретно в обработчиках int 10h.</font><p><h6>* EMan 2 beta: back in Black :)</h6>
Неизвестный
31.01.2005, 12:34
общий
это ответ
Здравствуйте, Самновский Ярослав Юрьевич!
Одна из ошибок:
В ДОСе и ВинХР шелле это обрабатываеться нормально... Но в других шеллах может потребоваться больший размер стека используемый биосом (особенно в Виндовсе98)...
Чтобы программа заработала нормально, увеличь стек (замени строку ".STACK 64" на ".stack256"...) и все заработает.
Форма ответа