model tiny
.code
.486
org 100h
start:
int 11h ;ф-я определяет устройства,результат в AX
mov dx,offset msg_banner
call print
;Извлекаем биты резултатов из AX
mov cx,16
mov bx,2
lable:
mov dx,0
div bx
push dx
loop lable
;========================================
;Определяем Disk device
pop dx ;0-ой бит
cmp dx,0
jne m1
mov dx,offset msg_dd
call print
jmp m2
m1:
mov dx,offset msg_no_dd
call print
m2:
;========================================
;Определяем сопроцессор
pop dx ;1-й бит
cmp dx,0
jne m21
mov dx,offset msg_coproc
call print
jmp m22
m21:
mov dx,offset msg_no_coproc
call print
m22:
;=========================================
;Определяем видео режим
pop dx
pop dx
pop dx ;4-й бит
cmp dx,0
jne m31
pop dx ;5-й бит
cmp dx,0
jne m311
mov dx,offset msg_vidmode_2
call print
jmp m312
m311:
mov dx,offset msg_vidmode_4
call print
m312:
jmp m32
m31:
pop dx ;5-й бит
cmp dx,0
jne m321
mov dx,offset msg_vidmode_1
call print
jmp m322
m321:
mov dx,offset msg_vidmode_3
call print
m322:
m32:
;=========================================
;Определяем число дисководов
pop dx ;6-ой бит
pop ax ;7-ой бит
shl ax,1 ;логический сдвиг влево один раз
add dx,ax
inc dx
mov ah,02h ;вывод числа
add dl,30h
int 21h
mov dx,offset msg_floppy
call print
;=========================================
;Определяем число RS232 адаптеров
pop dx
pop dx ;9-й бит
pop ax ;10-й бит
shl ax,1
add ax,dx
pop dx ;11-й бит
shl dx,2
add dx,ax
mov ah,02h
add dl,30h
int 21h
mov dx,offset msg_rs232
call print
;=========================================
;Определяем Joypad
pop dx ;12-й бит
cmp dx,0
jne m41
mov dx,offset msg_joystick
call print
jmp m42
m41:
mov dx,offset msg_no_joystick
call print
m42:
;=========================================
;Определяем принтеры
pop dx ;13-й бит
cmp dx,0
jne m51
mov dx,offset msg_no_printer
call print
jmp m52
m51:
pop dx ;14-й бит
pop ax ;15-й бит
shl ax,1
add dx,ax
mov ah,02h
add dl,30h
int 21h
mov dx,offset msg_printers_num
call print
m52:
;=========================================
the_end:
mov ax,4c00h
int 21h
print proc
push ax
push dx
mov ah,09h
int 21h
pop dx
pop ax
endp
;Строки
msg_banner db 'Device list:',0dh,0ah,'$'
msg_no_dd db 'Disk device: not found',0dh,0ah,'$'
msg_dd db 'Disk device: found',0dh,0ah,'$'
msg_no_coproc db 'Co-processor: not found',0dh,0ah,'$'
msg_coproc db 'Co-processor: found',0dh,0ah,'$'
msg_vidmode_1 db 'Default video mode: not used',0dh,0ah,'$'
msg_vidmode_2 db 'Default video mode: 25x40 color',0dh,0ah,'$'
msg_vidmode_3 db 'Default video mode: 25x80 color',0dh,0ah,'$'
msg_vidmode_4 db 'Default video mode: 25x80 monochrome',0dh,0ah,'$'
msg_floppy db ' floppy drive(s)',0dh,0ah,'$'
msg_rs232 db ' adapter(s) RS232',0dh,0ah,'$'
msg_no_joystick db 'Joystick: not found',0dh,0ah,'$'
msg_joystick db 'Joystick: present',0dh,0ah,'$'
msg_no_printer db 'Printer: not found',0dh,0ah,'$'
msg_printer db 'Printer: found',0dh,0ah,'$'
msg_printers_num db ' printer(s)',0dh,0ah,'$'
msg_empty db 0dh,0ah,'$'
end start
Помогите разобраться с ошибкой(процессор NTVDM обнаружил недопустимую инструкцию))
компилится TASM'ом(в .com)После запуска выдает ошибку
"процессор NTVDM обнаружил недопустимую инструкцию"и регистры показываются(в окне ошибки).Ну и разумеется,прога не выполняется.
Искал в инете об этом,нашел советы о том,что данные надо в конец помещать,у меня вроде так и есть.Ниже листинг:
Код:
У тебя в процедуре print в конце должен быть ret
Цитата: Gais
У тебя в процедуре print в конце должен быть ret
угу, именно. еще проверь что-бы совпадало кол-во push-ов и pop-ов.
Насчет самой ошибки, то она указывает только на то что, программа зависла или перешла по не правильному а дресу или вошла в вечный цыкл или еще очень много или...
Вобщем, если выскакивает такое дебаг в руки и смотри где, что не так происходит
не стоит также забывать, что ntdvm накладывает ограничения на некоторые функции, на пример, на прямой доступ к железу. Быть может стоит попробовать более лояльный эмулятор доса? DosBox, к примеру...
это да, но в этом случае он все схавает и не ругнетса, а на самом деле ничего не сделает.
Еще раз спасибо)