существует вот такой код : .386p rmcode segment para public 'CODE' use16 assume cs:rmcode,ss:rmstack start: in al,92h or al,2 out 92h,al xor eax,eax mov ax,rmcode shl eax,4 add eax,offset entrypoint mov dword ptr entryoff,eax xor eax,eax mov ax,rmcode shl eax,4 add ax,offset gdt mov dword ptr gdtr+2,eax lgdt fword ptr gdtr cli in al,70h or al,80h out 70h,al db 66h db 0eah entryoff dd ? dw 00001000b GDT: NULL_descr db 8 dup(0) CODE_descr db 0ffh,0ffh,00h,00h,00h,10011010b,11001111b,00h DATA_descr db 0ffh,0ffh,00h,00h,00h,10010010b,11011111b,00h VIDEO_descr db 0ffh,0ffh,00h,80h,0bh,10010010b,01000000b,00h GDT_size equ $-GDT GDTR dw GDT_size-1 dd ? rmcode ends rmstack segment para stack 'STACK' use16 db 100h dup(?) rmstack ends PM_CODE segment para public 'CODE' use32 assume CS:PM_CODE,DS:PM_DATA entrypoint: mov ax,00010000b mov ds,ax mov ax,00011000b mov es,ax xor si,si mov si,PM_DATA shl esi,4 add esi,offset message xor edi,edi mov ecx,mes_len rep movsb jmp $ PM_CODE ends PM_DATA segment para public 'DATA' use32 assume CS:PM_DATA message: irpc mes, db '&mes&',0Dh endm mes_len equ $-message PM_DATA ends end start (к стати взят с этого сайта) По идеи он должен перети в pm и вывести сообщение на экран. Но на экран ничего не выводится. Помогите найти ошибку.
Возможно, вывод в видеобуфер просто не отрабатывает, так как сейчас текущая страница экрана другая или типа того. Рекомендую еще в RM вызвать int 10h - инициализация режима: mov ah,00h mov al,03h int 10h Возможно, позже исчо гляну... ++ Не совсем понятно еще почему делается префикс db 66h - сегмент описан как use 16 (имею в виду переход в PM).
Замени на Код (Text): xor esi,esi mov si,seg PM_DATA shl esi,4 add esi,offset message Насчёт seg - может и без него работает, а вот обнулить надо 32-битный регистр. Ты в него пишешь 16 бит, потом сдвигаешь на 4 - и того 20 бит. А в старших 12 битах остаётся мусор...
В PM это не совсем так. Но, я, к сожалению, не знаю MASMовый синтаксис, поэтому плохо понимаю, что значит 'mov si,seg PM_DATA'. Соотвественно остается открытым вопрос, попадет ли линейный адрес в физический, где расположено сообщение, предназначенное для вывода.
mov si,seg PM_DATA означает поместить в si сегментный адрес PM_DATA Похоже проблема именно в этом так как замена всей этой конструкции на mov es:[200h],0fffffffh приводит к появлению на экране символа
Гы Ну ты блин юморист Делать было нечего - решил разобраться в чём косяк... Скажу сразу - ошибок несколько - но одна жёсткая. Во первых - здесь Код (Text): mov ax,rmcode shl eax,4 add eax,offset entrypoint mov dword ptr entryoff,eax offset считается относительно PM_CODE, а в качестве базы ты берёшь rmcode. Ну ещё перед rep movsb я бы cld поставил. И вот тут начинается самое интересное Обычно ошибки на этом этапе работы в PM (нет обработчиков исключений) приводят к ребуту. А тут прога просто подвисает и всё. Я уже даже дескрипторы все перепроверил, и тут только понял Ты всю эту фигню в RM твориш Создал GDT, загрузил, и jmp в туманные дали. А в PM кто переходить будет? Короче вот рабочий код: Код (Text): .386p rmcode segment para public 'CODE' use16 assume cs:rmcode, ds:rmcode, ss:rmstack start: push cs pop ds in al,92h or al,2 out 92h,al xor eax,eax mov ax,seg PM_CODE shl eax,4 add eax,offset entrypoint mov dword ptr [entryoff],eax xor eax,eax mov ax,seg rmcode shl eax,4 add eax,large offset GDT mov dword ptr [GDTR+2],eax lgdt fword ptr GDTR cli in al,70h or al,80h out 70h,al mov eax,cr0 or al,01h mov cr0,eax db 66h db 0eah entryoff dd ? dw 00001000b GDT: NULL_descr db 000h,000h,00h,00h,00h,00h,000h,00h CODE_descr db 0FFh,0FFh,00h,00h,00h,9Ah,0CFh,00h DATA_descr db 0FFh,0FFh,00h,00h,00h,92h,0CFh,00h VIDEO_descr db 0FFh,0FFh,00h,80h,0Bh,92h,0CFh,00h GDT_size equ $-GDT GDTR dw GDT_size-1 dd ? rmcode ends rmstack segment para stack 'STACK' use16 db 100h dup(?) rmstack ends PM_CODE segment para public 'CODE' use32 assume CS:PM_CODE, DS:PM_DATA entrypoint: mov ax,00010000b mov ds,ax mov ax,00011000b mov es,ax xor esi,esi mov esi,seg PM_DATA shl esi,4 add esi,offset message xor edi,edi mov ecx,mes_len cld rep movsb jmp $ PM_CODE ends PM_DATA segment para public 'DATA' use32 assume CS:PM_DATA message: irpc mes,<Hello World of PM :)> db '&mes&',04Fh endm mes_len equ $-message PM_DATA ends end start Да, и ещё у тебя строка для вывода не определена