Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите разобраться с ошибкой(процессор NTVDM обнаружил недопустимую инструкцию))

9.2K
11 ноября 2007 года
mikron
27 / / 07.01.2006
Неудобно создавать новую тему,но в поиске ничего подходящего не нашел.только начинаю изучать assembler.Есть задача:написать програму определяющую установленное на компе оборудование(общий шаблон программы дан,использовать int 11h обязательно)
компилится TASM'ом(в .com)После запуска выдает ошибку
"процессор NTVDM обнаружил недопустимую инструкцию"и регистры показываются(в окне ошибки).Ну и разумеется,прога не выполняется.
Искал в инете об этом,нашел советы о том,что данные надо в конец помещать,у меня вроде так и есть.Ниже листинг:

Код:
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
21K
11 ноября 2007 года
Gais
23 / / 28.03.2007
У тебя в процедуре print в конце должен быть ret
274
11 ноября 2007 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: Gais
У тебя в процедуре print в конце должен быть ret


угу, именно. еще проверь что-бы совпадало кол-во push-ов и pop-ов.
Насчет самой ошибки, то она указывает только на то что, программа зависла или перешла по не правильному а дресу или вошла в вечный цыкл или еще очень много или...
Вобщем, если выскакивает такое дебаг в руки и смотри где, что не так происходит

8.8K
11 ноября 2007 года
The_Ice
109 / / 04.04.2006
не стоит также забывать, что ntdvm накладывает ограничения на некоторые функции, на пример, на прямой доступ к железу. Быть может стоит попробовать более лояльный эмулятор доса? DosBox, к примеру...
274
11 ноября 2007 года
Lone Wolf
1.3K / / 26.11.2006
это да, но в этом случае он все схавает и не ругнетса, а на самом деле ничего не сделает.
9.2K
12 ноября 2007 года
mikron
27 / / 07.01.2006
Спасибо за советы=)Вставил ret.Прога запускается,правда кроме флопика ниче не определяет=))правда я ее под виндой запускаю...
Еще раз спасибо)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог