Консультация № 192544
08.02.2018, 12:50
0.00 руб.
0 2 1
Здравствуйте! Прошу помощи в следующем вопросе:
работаю на WinXP, опять проблема с примером из Калашникова:
Код:

;открытие, чтение и вывод файла на экран
CSEG segment ;в com-файлах существует только один сегмент
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Start:
;mov ax,0003h
;int 10h

mov dx,offset File_name
call Open_file
jc Error_file
mov bx,ax ;сохраняем id файла

mov ah,3Fh
mov cx,offset Finish-100h ;сколько байтов будем читать
mov dx,offset Start ;читаем файл в память...
int 21h ;...с метки Start

call Close_file ;вызываем процедуру закрытия и...
mov ah,9
mov dx,offset Mess_ok ;...сообщаем об этом
int 21h
ret

Error_file: ;сигнал, если файл не нашли
mov ah,2
mov dl,7
int 21h
ret

Open_file proc
cmp Handle,0FFFFh ;открыт-ли файл...
jne Quit_open ;...если нет-открываем
mov ax,3D00h
int 21h
mov Handle,ax
ret
Quit_open:
stc ;установка флага переноса в 1 (3Dh)
ret ;подтверждение факта открытия-для jc
Handle dw 0FFFFh
Open_file endp

Close_file proc
mov ah,3Eh
mov bx,Handle
int 21h
ret
Close_file endp

File_name db '07.asm', 0
Mess_ok db 'Все нормально!', 0Ah, 0Dh, '$'
Finish equ $ ;адрес конца программы
CSEG ends
end Start

При попытке создать com-файл появляется форточка с сообщением : Процессор NTVDM обнаружил недопустимую инструкцию. CS:00cf IP:0911 OP:de df 90 91 92. А при подключении (mov ax,0003h int 10h) появляется чистая панель с мигающим курсором.


Обсуждение

давно
Посетитель
7438
7205
08.02.2018, 13:24
общий
это ответ
Здравствуйте, cupoma58!
Если бы Вы внимательно просмотрели листинг из 9 главы (кстати, почему у Вас имя файла 07 ), то увидели бы, то имя загружаемого файла должно быть не ASM, а COM.
Т.к. программа грузит свой же код на свое же место. Вы же пытаетесь грузить исходник, текстовый файл...
Так что последствия интерпретации текста, как кода, абсолютно правильные...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.02.2018, 13:29
общий
08.02.2018, 13:33
Адресаты:
Еще момент: Вы захотели вывести сообщение на русском языке (вместо английского в оригинале).
Вы увидите абракадабру, т.к. в коде кириллица в коде ANSI (CP-1251), а при выводе в консоли используется досовская кодировка (CP-866). Или перекодируйте само сообщение в кодировку 866, или выводите сообщения английскими буковками
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа