Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Assembler]Вывести сообщение


Автор: Гениальный123Робот 4.5.2007, 00:48
Написать программу, переключающую процессор в защищенный режим, выводящую на экране сообщение и затем возвращающую процессор в реальный режим. 
Заранее спасибо

Автор: ama_kid 4.5.2007, 12:39
http://www.wasm.ru/print.php?article=pipm08 не поможет?

Автор: Гениальный123Робот 5.5.2007, 09:35
Цитата(ama_kid @ 4.5.2007,  12:39)
http://www.wasm.ru/print.php?article=pipm08 не поможет?

К сожалению, нет...

Автор: dumb 5.5.2007, 14:24
пример из http://dump.ru/files/2/20000845/.
Код

; pm0.asm
; Программа, выполняющая переход в защищенный режим и немедленный возврат.
; Работает в DOS в реальном режиме и в DOS-окне Windows 95 (Windows 
; перехватывает исключения, возникающие при попытке перехода в защищенный 
; режим из V86, и позволяет нам работать, но только на минимальном уровне 
; привилегий)
;
; Компиляция:
; TASM:
;  tasm /m pm0.asm
;  tlink /x /t pm0.obj
; MASM:
;  ml /c pm0.asm
;  link pm0.obj,,NUL,,,
;  exe2bin pm0.exe pm0.com
; WASM:
;  wasm pm0.asm
;  wlink file pm0.obj form DOS COM
;

    .model    tiny
    .code
    .386p        ; все наши примеры рассчитаны на 80386
    org    100h    ; это COM-программа
start:
; подготовить сегментные регистры
    push    cs
    pop    ds        ; DS - сегмент данных (и кода) нашей программы
    push    0B800h
    pop    es        ; ES - сегмент видеопамяти
; проверить, находимся ли мы уже в защищенном режиме
    mov    eax,cr0    ; прочитать регистр CR0
    test    al,1        ; проверить бит PE,
    jz    no_V86    ; если он ноль - мы можем продолжать,
; иначе - сообщить об ошибке и выйти
    mov    ah,9        ; функция DOS 09h
    mov    dx,offset v86_msg    ; DS:DX - адрес строки
    int    21h        ; вывод на экран
    ret            ; конец COM-программы
; (раз это защищенный режим, в котором работает наша DOS-
; программа, это должен быть режим V86)
v86_msg    db    "Running in V86 mode. Can't switch to PM$"

; сюда передается управление, если мы запущены в реальном режиме
no_V86:
; запретить прерывания
    cli
; запретить немаскируемое прерывания
    in    al,70h    ; индексный порт CMOS
    or    al,80h    ; установка бита 7 в нем запрещает NMI
    out    70h,al
; перейти в защищенный режим
    mov    eax,cr0    ; прочитать регистр CR0
    or    al,1    ; установить бит PE,
    mov    cr0,eax    ; с этого момента мы в защищенном режиме
; вывод на экран
    xor    di,di            ; ES:DI - начало видеопамяти
    mov    si,offset message    ; DS:SI - выводимый текст
    mov    cx,message_l
    rep movsb        ; вывод текста
    mov    ax,0720h    ; пробел с атрибутом 07h
    mov    cx,rest_scr    ; заполнить этим символом остаток экрана
    rep stosw
; переключиться в реальный режим
    mov    eax,cr0    ; прочитать CR0
    and    al,0FEh    ; сбросить бит PE
    mov    cr0,eax    ; с этого момента процессор работает в реальном 
            ; режиме
; разрешить немаскируемое прерывание
    in    al,70h    ; индексный порт CMOS
    and    al,07FH    ; сброс бита 7 отменяет блокирование NMI
    out    70h,al
; разрешить прерывания
    sti
; подождать нажатия любой клавиши
    mov    ah,0
    int    16h
; выйти из COM-программы
    ret
; текст сообщения с атрибутом после каждого символа для прямого вывода на экран
message    db    'H',7,'e',7,'l',7,'l',7,'o',7,' ',7,'f',7
    db    'r',7,'o',7,'m',7,' ',7,'P',7,'M',7
; его длина в байтах
message_l = $-message
; длина оставшейся части экрана в словах
rest_scr = (80*25)-(2*message_l)
    end    start



Автор: Гениальный123Робот 5.5.2007, 22:47
Спасибо ;) +

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)