masm 16/32x битные приложения *.bin

Тема в разделе "WASM.BEGINNERS", создана пользователем h3rmit, 25 июл 2009.

  1. h3rmit

    h3rmit New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    28
    Изучаю защищенный режим, etc.
    Столкнулся со следующей проблемой. У Broken Sword`а в серии статей про PM есть пример перевода. Там идет вычисление линейного адреса "точки входа" в PM для последующего дальнего jmp`а следующим образом:

    (это всё происходит в 16 битном сегменте)
    xor EAX,EAX
    (*)mov AX,PM_CODE
    shl EAX,4
    add EAX,offset ENTRY_POINT

    где PM_CODE - имя 32 битного сегмента, в котором лежит код для PM.
    Проблема в следующем: строка (*) ведь создаст релок, тк неизвестно по какому адресу загрузится сегмент PM_CODE. И никак не перегнать объектник в .bin изза этого, тк unilink пишет, что Segment selector relocs (at 0000:00007C0F) are not supported in COM/BIN file (что в принципе понятно). Можно какимто образом обойти эту проблему? Как я понял, в masm`е писать смешанный 16\32 битный код можно только в разных сегментах, да и всё равно придется вычислять линейный адрес для дальнего jmp`а (сегмент кода занимает все 4Гб) ...

    ЗЫ Сорри за несколько путанные объяснения - ещё плаваю сильно в этих материях ^____^

    ЗЫЫ. Вот собственно код весь

    Код (Text):
    1.     .386p
    2.    
    3.  
    4. RM_CODE segment para public 'CODE' use16
    5. assume  cs:RM_CODE, ss:RM_STACK
    6. org 7C00h
    7. @@start:
    8.  
    9.     ;Очищаем экран
    10.     mov ax, 03h
    11.     int 10h
    12.  
    13.     ;открываем линию A20 (чтобы задействовать 32 битную адресацию)
    14.     in  al, 92h
    15.     or  al, 02h
    16.     out 92h, al
    17.  
    18.     ;Вычисляем линейный адрес точки входа в защищенный режим
    19.     xor     eax, eax
    20.     (*)mov  ax, PM_CODE
    21.     shl eax, 4      ;*16d
    22.     add eax, offset ENTRY_POINT
    23.     mov dword ptr ENTRY_OFF, eax
    24.    
    25.     ;Вычисляем линейный адрес GDT
    26.     xor     eax, eax
    27.     (*)mov  ax, RM_CODE
    28.     shl eax, 4
    29.     add eax, offset GDT
    30.     mov dword ptr GDTR+2, EAX
    31.    
    32.     ;Загружаем GDTR
    33.     lgdt    fword ptr GDTR
    34.  
    35.     ;Запрет маскируемых прерываний
    36.     cli
    37.  
    38.     ;Запрет немаскируемых прерываний
    39.     in  al, 70h
    40.     or  al, 80h
    41.     out 70h, al
    42.  
    43.     ;Переключение в защищенный режим
    44.     mov eax, cr0
    45.     or  ax, 1
    46.     mov cr0, eax
    47.  
    48.     ;Загружаем селектор в CS
    49.    
    50.         db  66h
    51.         db  0EAh
    52. ENTRY_OFF   dd  ?
    53.         dw  00001000b
    54.    
    55.  
    56.  
    57. ;Глобальная таблица дескрипторов
    58.  
    59. GDT:
    60.  
    61. nulldescr   db  08h dup(0)
    62. codedescr   db  0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00h
    63. datadescr   db  0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00h
    64. videdescr   db  0FFh, 0FFh, 00h, 80h, 0Bh, 10010010b, 11000000b, 00h
    65.  
    66. GDT_size    equ $ - GDT
    67.  
    68. GDTR        dw  GDT_size - 1
    69.         dd  ?
    70.  
    71. RM_CODE ends
    72.  
    73. RM_STACK    segment para stack 'STACK' use16
    74.  
    75.     db  100h dup(?)
    76.  
    77. RM_STACK    ends
    78.  
    79. PM_CODE segment para public 'CODE' use32
    80. assume  CS:PM_CODE, DS:PM_DATA
    81.  
    82. ENTRY_POINT:
    83.  
    84.     mov ax, 00010000b
    85.     mov ds, ax
    86.     mov ax, 00011000b
    87.     mov es, ax
    88.  
    89.     xor esi, esi
    90.     (*)mov  si, PM_DATA
    91.     shl esi, 4
    92.     add esi, offset message
    93.    
    94.     xor     edi, edi
    95.     mov ecx, mes_len
    96.    
    97.     rep movsb
    98.     jmp $  
    99.  
    100. PM_CODE ends
    101.  
    102. PM_DATA segment para public 'DATA' use32
    103.  
    104.     message db  "HelloWorld from PM", 0Ah, 0Dh
    105.     mes_len equ $ - message
    106.  
    107. PM_DATA ends
    108.    
    109. end @@start
     
  2. h3rmit

    h3rmit New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    28
    10 минут потратил разбираясь с синтаксисом fasm`a и за минуту переписал тоже самое под него. И это против 2 часов долбания об стену с масмом. А до этого я не понимал зачем чтото кроме масма есть ^____^.
    И всетаки, как сделать подобное на masm?

    Код для fasm (несколько упрощено)

    Код (Text):
    1. org     7C00h
    2. use16
    3.  
    4. _start:
    5.         cli
    6.         mov     ax, cs
    7.         mov     ds, ax
    8.         mov     ss, ax
    9.         mov     sp, _start
    10.  
    11.         lgdt   fword [GDTR]
    12.  
    13.         in      al, 92h
    14.         or      al, 2
    15.         out     92h, al
    16.  
    17.         mov     eax, cr0
    18.         or      al, 1
    19.         mov     cr0, eax
    20.  
    21.         jmp     08h:_protected
    22.  
    23. use32
    24.  
    25. _protected:
    26.  
    27.         mov     ax, 10h
    28.         mov     ds, ax
    29.         mov     ss, ax
    30.         mov     ax, 18h
    31.         mov     es, ax
    32.  
    33.         mov     esi, msg
    34.         call    kputs
    35.  
    36.         hlt
    37.         jmp     short $
    38.  
    39. kputs:
    40.  
    41.         pusha
    42. loopaz:
    43.         lodsb
    44.         test    al, al
    45.         jz      quit
    46.  
    47.         mov     ecx, [cursor]
    48.         mov     byte [es:ecx], al
    49.         shl     dword [cursor], 1
    50.         jmp     loopaz
    51.  
    52. quit:
    53.         popa
    54.         ret
    55.  
    56. cursor  dd      0
    57. msg     db      "Hello world from PM!", 0
    58.  
    59.  
    60. ;Ãëîáàëüíàÿ òàáëèöà äåñêðèïòîðîâ
    61.  
    62. GDT:
    63.  
    64. nulldescr       db      08h dup(0)
    65. codedescr       db      0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00h
    66. datadescr       db      0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00h
    67. videdescr       db      0FFh, 0FFh, 00h, 80h, 0Bh, 10010010b, 11000000b, 00h
    68.  
    69. GDT_size        equ     $ - GDT
    70.  
    71. GDTR            dw      GDT_size - 1
    72.                 dd      GDT