переход в pm

Тема в разделе "WASM.ASSEMBLER", создана пользователем int_0x80, 17 июл 2006.

  1. int_0x80

    int_0x80 New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    25
    существует вот такой код :

    .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 и вывести сообщение на экран.
    Но на экран ничего не выводится.
    Помогите найти ошибку.
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Возможно, вывод в видеобуфер просто не отрабатывает, так как сейчас текущая страница экрана другая или типа того. Рекомендую еще в RM вызвать int 10h - инициализация режима:

    mov ah,00h
    mov al,03h
    int 10h

    Возможно, позже исчо гляну...

    ++

    Не совсем понятно еще почему делается префикс db 66h - сегмент описан как use 16 (имею в виду переход в PM).
     
  3. int_0x80

    int_0x80 New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    25
    Нет не помогло
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Замени на
    Код (Text):
    1.         xor esi,esi
    2.         mov si,seg PM_DATA
    3.         shl    esi,4
    4.         add     esi,offset message
    Насчёт seg - может и без него работает, а вот обнулить надо 32-битный регистр.
    Ты в него пишешь 16 бит, потом сдвигаешь на 4 - и того 20 бит.
    А в старших 12 битах остаётся мусор...
     
  5. int_0x80

    int_0x80 New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    25
    И это не помогло :dntknw:
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Честно говоря, не совсем понял, почему к чему 'shl esi, 0x4'?..
     
  7. int_0x80

    int_0x80 New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    25
    Насколько я знаю так вычесляется линейный адрес чего-либо
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В PM это не совсем так. Но, я, к сожалению, не знаю MASMовый синтаксис, поэтому плохо понимаю, что значит 'mov si,seg PM_DATA'. Соотвественно остается открытым вопрос, попадет ли линейный адрес в физический, где расположено сообщение, предназначенное для вывода.
     
  9. int_0x80

    int_0x80 New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    25
    mov si,seg PM_DATA означает поместить в si сегментный адрес PM_DATA
    Похоже проблема именно в этом так как замена всей этой конструкции на mov es:[200h],0fffffffh
    приводит к появлению на экране символа
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Гы :) Ну ты блин юморист ;)
    Делать было нечего - решил разобраться в чём косяк...
    Скажу сразу - ошибок несколько - но одна жёсткая.
    Во первых - здесь
    Код (Text):
    1.     mov ax,rmcode
    2.     shl eax,4
    3.     add eax,offset entrypoint
    4.     mov dword ptr entryoff,eax
    offset считается относительно PM_CODE, а в качестве базы ты берёшь rmcode.
    Ну ещё перед rep movsb я бы cld поставил.
    И вот тут начинается самое интересное :)
    Обычно ошибки на этом этапе работы в PM (нет обработчиков исключений) приводят к ребуту. А тут прога просто подвисает и всё.
    Я уже даже дескрипторы все перепроверил, и тут только понял :)
    Ты всю эту фигню в RM твориш :)
    Создал GDT, загрузил, и jmp в туманные дали.
    А в PM кто переходить будет?

    Короче вот рабочий код:

    Код (Text):
    1.         .386p
    2. rmcode      segment para    public  'CODE'  use16
    3.         assume  cs:rmcode, ds:rmcode, ss:rmstack        
    4.     start:
    5.         push    cs
    6.         pop ds
    7.  
    8.         in  al,92h
    9.         or  al,2
    10.         out 92h,al
    11.  
    12.         xor eax,eax
    13.         mov ax,seg PM_CODE
    14.         shl eax,4
    15.         add eax,offset entrypoint
    16.         mov dword ptr [entryoff],eax
    17.  
    18.         xor eax,eax
    19.         mov ax,seg rmcode
    20.         shl eax,4
    21.         add eax,large offset GDT
    22.  
    23.         mov dword ptr [GDTR+2],eax
    24.  
    25.         lgdt    fword ptr GDTR
    26.  
    27.         cli
    28.  
    29.         in  al,70h
    30.         or  al,80h
    31.         out 70h,al
    32.  
    33.         mov eax,cr0
    34.         or  al,01h
    35.         mov cr0,eax
    36.  
    37.         db  66h
    38.         db  0eah
    39. entryoff    dd  ?
    40.         dw  00001000b
    41.  
    42. GDT:
    43. NULL_descr  db  000h,000h,00h,00h,00h,00h,000h,00h
    44. CODE_descr  db  0FFh,0FFh,00h,00h,00h,9Ah,0CFh,00h
    45. DATA_descr  db  0FFh,0FFh,00h,00h,00h,92h,0CFh,00h
    46. VIDEO_descr db  0FFh,0FFh,00h,80h,0Bh,92h,0CFh,00h
    47. GDT_size    equ $-GDT
    48.  
    49. GDTR        dw    GDT_size-1
    50.         dd    ?
    51. rmcode      ends
    52.  
    53. rmstack     segment para    stack   'STACK' use16
    54.         db  100h    dup(?)
    55. rmstack     ends
    56.  
    57. PM_CODE     segment para    public  'CODE'  use32
    58.         assume  CS:PM_CODE, DS:PM_DATA
    59. entrypoint:
    60.         mov ax,00010000b
    61.         mov ds,ax
    62.  
    63.         mov ax,00011000b
    64.         mov es,ax
    65.  
    66.         xor esi,esi
    67.         mov esi,seg PM_DATA
    68.         shl esi,4
    69.         add esi,offset message
    70.         xor edi,edi
    71.         mov ecx,mes_len
    72.         cld
    73.         rep movsb
    74.         jmp $
    75. PM_CODE     ends
    76.  
    77. PM_DATA     segment para    public  'DATA'  use32
    78.         assume CS:PM_DATA
    79. message:
    80. irpc        mes,<Hello World of PM :)>
    81.         db  '&mes&',04Fh
    82. endm
    83. mes_len     equ $-message
    84. PM_DATA     ends
    85.         end start
    Да, и ещё у тебя строка для вывода не определена :)
     
  11. int_0x80

    int_0x80 New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    25
    ОГРОМНОЕ тебе спасибо!!!!!