Несколько вопросов начинающего

Тема в разделе "WASM.BEGINNERS", создана пользователем s3dworld, 6 окт 2010.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    baldr
    Спасибо! Буду с нетерпением ждать ответа про многозадачность.
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Многозадачность через task gate мало кто использовал, так что с переходом к 64 битам потеря невелика. В TSS осталось то, что существенно: копии указателей стэка для колец 0…2, указатель на битмэп доступа к портам, и новая штука, IST. Это вроде справочника хороших указателей стэка для обработчиков прерываний/исключений, дескриптор в IDT говорит, который использовать. Так что TSS жив и здоров, хотя к многозадачности уже не имеет отношения.
     
  3. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    baldr
    Не указатель, а смещение. Битовая карта должна располагаться в пределах сегмента TSS, смещение по умолчанию устанавливается за пределами сегмента, таким образом все обращения к портам будут генерировать исключение. Смещение можно установить через Ke386IoSetAccessProcess, в винде больше 1й битовой карты установить не получиться (изза размеров сегмента TSS).

    з.ы. автор, читай доки и не мучай форум =]
     
  4. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    TSS
    Конечно я документации читаю (с переводчиком) но всё же, для того он и форум, чтобы люди помогали друг другу. Да тем более я форум не загаживаю, создал тему и в ней всё спрашиваю.

    А кто-нибудь создавал свою операционную систему с графической оболочкой, наподобие как Windows?
     
  5. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    У меня беда. Вместе с ещё одним парнем изучаем процессор и пытаемся написать свою операционную систему. Вот я начал вчера делать загрузчик. Написал код, всё нормально работало. А когда сегодня добавил туда комментарии (украшения), то у меня клавиши стали работать на оборот: Enter - выход, а Escape - установка. Хотя должно быть наоборот. Не понимаю что я мог изменить. По коду вроде всё правильно. У меня уже рассудок замутнён. У кого свежий взгляд, посмотрите, пожалуйста что не так:

    Код (Text):
    1. ; Имя:           Boot
    2. ; Описание:     Загрузочный сектор
    3. ; Автор:       Дубровкин Сергей
    4. ; Начало:     21.10.2010 - 17:54
    5. ; Завершение: ??.??.???? - ??:??
    6.  
    7. use16
    8. org 0x7C00
    9.  
    10. ; *******************************************************************************
    11. ;                                       К О Д
    12. ; *******************************************************************************
    13.  
    14. bootCode16:
    15.     mov AX,CS
    16.     mov DS,AX
    17.     mov ES,AX
    18.     mov FS,AX
    19.     mov GS,AX
    20.     mov AX,bootStack16
    21.     mov SS,AX
    22.     mov AX,bootStackStart16
    23.     mov SP,AX
    24.    
    25.     call BootSaveScreen
    26.     call BootInitScreen
    27.    
    28.     mov BL,00000000b
    29.     call BootClearScreen
    30.    
    31.     mov SI,bootTextTitle
    32.     mov BL,00001111b
    33.     mov DH,2
    34.     mov DL,32
    35.     call BootDrawText
    36.    
    37.     mov SI,bootTextDescription
    38.     mov BL,00001111b
    39.     mov DH,3
    40.     mov DL,27
    41.     call BootDrawText
    42.    
    43.     mov SI,bootTextKey1
    44.     mov BL,00001111b
    45.     mov DH,10
    46.     mov DL,26
    47.     call BootDrawText
    48.    
    49.     mov SI,bootTextKey2
    50.     mov BL,00001111b
    51.     mov DH,12
    52.     mov DL,28
    53.     call BootDrawText
    54.    
    55.     mov SI,bootTextAutors
    56.     mov BL,00001111b
    57.     mov DH,22
    58.     mov DL,20
    59.     call BootDrawText
    60.    
    61.     mov SI,bootTextYear
    62.     mov BL,00001111b
    63.     mov DH,23
    64.     mov DL,36
    65.     call BootDrawText
    66.    
    67.     call BootKeyDown
    68.     test AL,AL
    69.     jz BootLabelEnd
    70.    
    71.     ; -------------------------------------------------------------------{
    72.     ;                            В Р Е М Е Н Н О
    73.     ; --------------------------------------------------------------------
    74.     mov DH,0x00
    75.     mov DL,0x00
    76.     call BootSetCursorPos
    77.    
    78.     mov BL,00010000b
    79.     call BootClearScreen
    80.    
    81.     mov SI,bootTextOK
    82.     mov BL,00011010b
    83.     mov DH,1
    84.     mov DL,1
    85.     call BootDrawText
    86.    
    87.     label1:
    88.         jmp label1
    89.     ; -------------------------------------------------------------------}
    90.        
    91.     BootLabelEnd:
    92.         call BootLoadScreen
    93.         int 0x18
    94.  
    95. ; *******************************************************************************
    96. ;                                П Р О Ц Е Д У Р Ы
    97. ; *******************************************************************************
    98.  
    99. ; ------------------------------------------------------------------------------{
    100. ; Название: BootKeyDown()
    101. ; Описание: Нажатие клавиши
    102. ; Вход:     Нет
    103. ; Выход:   AL - код
    104. ; -------------------------------------------------------------------------------
    105. BootKeyDown:
    106.     BootKeyDownRepeat:
    107.         mov AH,0x00
    108.         int 0x16
    109.         test AH,0x01
    110.     jz BootKeyDownEscape
    111.         test AH,0x1C
    112.     jz BootKeyDownEnter
    113.         jmp BootKeyDownRepeat
    114.    
    115.     BootKeyDownEscape:
    116.         mov AL,0x00
    117.         jmp BootKeyDownEnd
    118.    
    119.     BootKeyDownEnter:
    120.         mov AL,0x01
    121.        
    122.     BootKeyDownEnd:
    123. ret
    124. ; ------------------------------------------------------------------------------}
    125.  
    126. ; ------------------------------------------------------------------------------{
    127. ; Название: BootSaveScreen()
    128. ; Описание: Сохранение видео-режима
    129. ; Вход:     Нет
    130. ; Выход:   Нет
    131. ; -------------------------------------------------------------------------------
    132. BootSaveScreen:
    133.     mov AH,0x0F
    134.     int 0x10
    135.     mov [bootScreenMode],AL
    136.     mov [bootSymbols],AH
    137.     mov [bootPageNumber],BH
    138. ret
    139. ; ------------------------------------------------------------------------------}
    140.  
    141. ; ------------------------------------------------------------------------------{
    142. ; Название: BootLoadScreen()
    143. ; Описание: Загрузка видео-режима
    144. ; Вход:     Нет
    145. ; Выход:   Нет
    146. ; -------------------------------------------------------------------------------
    147. BootLoadScreen:
    148.     mov AH,0x00
    149.     mov AL,[bootScreenMode]
    150.     int 0x10
    151.     mov AL,[bootPageNumber]
    152.     call BootSetScreenPage
    153. ret
    154. ; ------------------------------------------------------------------------------}
    155.  
    156. ; ------------------------------------------------------------------------------{
    157. ; Название: BootInitScreen()
    158. ; Описание: Инициализация видео-режима
    159. ; Вход:     Нет
    160. ; Выход:   Нет
    161. ; -------------------------------------------------------------------------------
    162. BootInitScreen:
    163.     mov AH,0x00
    164.     mov AL,0x03
    165.     int 0x10
    166. ret
    167. ; ------------------------------------------------------------------------------}
    168.  
    169. ; ------------------------------------------------------------------------------{
    170. ; Название: BootClearScreen()
    171. ; Описание: Очистка экрана
    172. ; Вход:     BL - цвет
    173. ; Выход:   Нет
    174. ; -------------------------------------------------------------------------------
    175. BootClearScreen:
    176.     mov AH,0x09
    177.     mov AL,' '
    178.     mov BH,0x00
    179.     mov CX,2000
    180.     int 0x10
    181. ret
    182. ; ------------------------------------------------------------------------------}
    183.  
    184. ; ------------------------------------------------------------------------------{
    185. ; Название: BootSetScreenPage()
    186. ; Описание: Установка страницы
    187. ; Вход:     AL - номер страница
    188. ; Выход:   Нет
    189. ; -------------------------------------------------------------------------------
    190. BootSetScreenPage:
    191.     mov AH,0x05
    192.     int 0x10
    193. ret
    194. ; ------------------------------------------------------------------------------}
    195.  
    196. ; ------------------------------------------------------------------------------{
    197. ; Название: BootSetCursorPos()
    198. ; Описание: Установка положения курсора
    199. ; Вход:     DH - номер строки
    200. ;           DL - номер столбца
    201. ; Выход:   Нет
    202. ; -------------------------------------------------------------------------------
    203. BootSetCursorPos:
    204.     mov AH,0x02
    205.     mov BH,0x00
    206.     int 0x10
    207. ret
    208. ; ------------------------------------------------------------------------------}
    209.  
    210. ; ------------------------------------------------------------------------------{
    211. ; Название: BootDrawText()
    212. ; Описание: Вывод текста
    213. ; Вход:     BL - атрибуты текста
    214. ;           DH - номер строки
    215. ;           DL - номер столбца
    216. ; Выход:   Нет
    217. ; -------------------------------------------------------------------------------
    218. BootDrawText:
    219.     mov CX,1
    220.  
    221.     BootDrawTextLoop:
    222.         call BootSetCursorPos
    223.         mov AH,0x09
    224.         mov BH,0x00
    225.         lodsb
    226.         test AL,AL
    227.         jz BootDrawTextExit
    228.         int 0x10
    229.         inc DL
    230.     jmp BootDrawTextLoop
    231.  
    232.     BootDrawTextExit:
    233. ret
    234. ; ------------------------------------------------------------------------------}
    235.  
    236. ; *******************************************************************************
    237. ;                                   Д А Н Н Ы Е
    238. ; *******************************************************************************
    239.  
    240. bootData16:
    241.     bootScreenMode      db 0x00
    242.     bootSymbols         db 0x00
    243.     bootPageNumber      db 0x00
    244.     bootTextTitle       db "Hello in BOS!",0x00
    245.     bootTextDescription db "(Basic Operation System)",0x00
    246.     bootTextKey1        db "Press 'Enter' for continue.",0x00
    247.     bootTextKey2        db "Press 'Escape' for exit.",0x00
    248.     bootTextAutors      db "Dubrovkin Sergei & Konstantin Dement'ev",0x00
    249.     bootTextYear        db "(2010)",0x00
    250.     bootTextOK          db "You in press 'Enter' key.",0x00
    251.  
    252. ; *******************************************************************************
    253. ;                                    С Т Е К
    254. ; *******************************************************************************
    255.  
    256. bootStack16:
    257.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    258.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    259.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    260.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    261.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    262.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    263.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    264.     bootStackStart16:
    265.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    266.  
    267. ; *******************************************************************************
    268. ;                           Д О П О Л Н И Т Е Л Ь Н О
    269. ; *******************************************************************************
    270.  
    271. ; Заполнение до 510 байт
    272. rb 510-($-$$)
    273. ; Метка загрузочного сектора
    274. db 0x55,0xAA
    275.  
    276. ; Дубровкин Сергей © 2010
     
  6. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всё, по коду сам разобрался. Запутался я с test и воткнул снова cmp.
     
  7. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Если не хочешь использовать шлюзы вызова, то используй syscall/sysret. Это более быстрый механизм и используется во всех современных ОС. А факт наличия 64-битности гарантирует поддержку этого механизма.
    test al, al = cmp al, 0
    в остальных ситуациях test для сравнения не нужен.
     
  8. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    А если я перейду в защищённый режим, создам странички и опишу в страничке диапазон от 0x0000B800 до 0x0000B800 + 4 МБ, то я смогу при обращении к этой странички напрямую записывать данные в видеобуфер? И так же в длинном режиме? Правда не совсем понятно как тогда определить какая страничка что адресует, ведь они же сделаны для виртуальной памяти. Ладно с сегментами, их чётко привязываешь к адресу.
     
  9. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Судите как хотите, но я начал разрабатывать свой ассемблер. Первым делом решил рассмотреть команды пересылки данных (MOV). Вот табличка из документации Intel:

    [​IMG]

    Собственно из регистра в регистр, из памяти в регистр и из регистра в память - это всё понятно. А вот из immediate в регистр и память - это я не понимаю что вообще такое (а главное только в, а не из). Что это?

    То что существует по два опкода для одного и того же действия, это я уже давно знал (поменять бит направления и поменять местами регистры). Но вот увидел что написано в таблице:
    Удивительно, это получается что команду:
    Код (Text):
    1. mov EAX,ECX
    Можно записать в четырёх записях?

    А собственно зачем нужно:
    Ведь это можно реализовать и через:
    Какое от них преимущество?
     
  10. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Непосредственное значение. Например,
    mov eax, 1
    Почему "в" нельзя сам догадайся.
     
  11. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV
    О, точно! Спасибо! Я про это совсем забыл.

    Ну а зачем последние две инструкции?
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > в остальных ситуациях test для сравнения не нужен.
    м? а проверка соответствующих битов?
    например битовые флаги очень удобны.
     
  13. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Ребят, тут я задумался...

    Создавать операционную систему я хочу. Я уже давно пытался и не раз, но всё заканчивалось тем, что я плевал на это дело. А теперь всё, решил - делать буду до конца.

    Но задумался я не об этом. Я же хочу создавать свой ассемблер, чтобы на нём делать операционную систему. Вот и думаю...напишу я под Windows ассемблер на языке C++, который будет использовать функции Win32 API. Напишу я на нём операционную систему. А дальше то что? Моя операционная система не знает ни исходных кодов на языке C++, ни функций Win32 API - другая операционная система, всё другое. То есть ассемблер мне нужно будет делать с нуля именно для моей операционной системы.

    Вот и думаю, стоит ли мне сейчас его делать под Windows или нет. Хочется, но вот двойную работу ведь выполнять придётся, не получится же просто взять и портировать.

    Что Вы думаете по этому поводу?
     
  14. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Не-е, начинать тогда надо со своего процессора. Чтоб уж наверняка все свое ;)
     
  15. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    FatMoon
    ))
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Многие хотели. Обычно желание заканчивается при попытке реализации(разумеется если не копипаст линуса). В особо тяжёлых случаях желание исчезает на стопяцот к строке, после чего кодера осеняет что затея гиблая и лучше юзать уже созданные системы, тем более что создать подобную NT ось с нуля невозможно. А с вопросами про пэйджинг и прочее как можно вообще и думать про написание оси, это же элементарные принципы.
     
  17. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Я имел ввиду test как альтернативу cmp.
    То что у него есть и "штатные" функции я не спорю - сам им для этих целей пользуюсь.
    Ты можешь пользоваться не WinAPI, а libc. Для ассемблера его хватит.
    Только вот тебе ещё придётся писать и компилятор С++ для своей ОС. Или писать Ассемблер на самом себе. Второй вариант мне кажется менее трудоёмким (если синтаксис будет совместим с одним из существующих, то для первой компиляции будет использоваться он, а потом уже твой ассемблер). А вообще затея бессмысленна. Ты реши уж что хочешь написать - свою ОС, свой Ассемблер, свой компилятор C++. Каждая задача по отдельности реальна (хотя первая займёт очень много времени). Но реализовать всё вместе нет. Пока ты напишиешь нормальный компилятор C++ желание писать ОС уже не будет. Аналогично с асмом. Лучше посвяти всё время написанию ОС. Хоть её ты напишешь (хотя конкурента Windows или Linux - нет. тут нужен не один человек и не один год работы). Уж лучше запускай fasm в 32-битном сегменте. Ничего плохого в этом нет. Особых сложностей с реализацией - тоже.
    Ага. Надо соблюдать принцип "от простого к сложному". Сначала как следует изучи реальный режим. Потом PM. Потом PM со страничной адресацией. И только тогда long mode. И если желание останется - пиши свою ОС. Но не свой Ассемблер.
    )))
     
  18. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    Более-менее знать английский для занятий системным программированием абсолютно необходимо, без этого там делать ровным счётом нечего. Так что учите.
     
  19. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    s3dworld,

    Готов подписаться под каждым словом предыдущего оратора.

    P.S. Чтобы добавить конструктива — могу предложить помощь в переводе/понимании замороченных мест в Intel SDM/AMD APM.
     
  20. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    baldr
    Спасибо, я Вас в ICQ добавил.

    Ребят, от слов перешёл к дело. Начал писать код перехода. Хочу спросить Ваши советы по поводу написания кода: что не так, как лучше бы и прочее. И правильно ли я заполнил таблицу дескрипторов (нулевой, для кода на уровне 0, для данных на уровне 0, для кода на уровне 3 и для данных на уровне 3). Для всех них (кроме нулевого) база в 0 и максимальный предел (4 ГБ).

    Видимо придётся туда ещё добавлять системные дескрипторы (ведь без прерываний никак), так как шлюзы вызова, ловушки и задачи - это ведь всё тоже лежит в GDT (вроде бы).

    А вот сам код (пока только начал):

    Код (Text):
    1. ; Имя:           translation_pmode
    2. ; Описание:     Перевод процессора в защищённый режим
    3. ; Автор:       Дубровкин Сергей
    4. ; Начало:     23.10.2010 - 11:48
    5. ; Завершение: ??.??.???? - ??:??
    6. ; *******************************************************************************
    7.  
    8. use16
    9.  
    10. ; *******************************************************************************
    11. ;                                      К О Д
    12. ; *******************************************************************************
    13.  
    14. translation_pmode__Code16:
    15.     hlt
    16.  
    17. translation_pmode__Code32:
    18.     hlt
    19.  
    20. ; *******************************************************************************
    21. ;                                   Д А Н Н Ы Е
    22. ; *******************************************************************************
    23.  
    24. translation_pmode__Data16:
    25.     translation_pmode__gdt:
    26.         translation_pmode__descriptor0:
    27.             db 00000000b            ; Base Address(8)
    28.             db 00000000b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    29.             db 00000000b            ; P(1), DPL(2), S(1), Type(4)
    30.             db 00000000b            ; Base Address(8)
    31.             dw 0000000000000000b    ; Base Address(16)
    32.             dw 0000000000000000b    ; Segment Limit(16)
    33.         translation_pmode__descriptor1:
    34.             db 00000000b            ; Base Address(8)
    35.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    36.             db 10011000b            ; P(1), DPL(2), S(1), Type(4)
    37.             db 00000000b            ; Base Address(8)
    38.             dw 0000000000000000b    ; Base Address(16)
    39.             dw 1111111111111111b    ; Segment Limit(16)
    40.         translation_pmode__descriptor2:
    41.             db 00000000b            ; Base Address(8)
    42.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    43.             db 10010010b            ; P(1), DPL(2), S(1), Type(4)
    44.             db 00000000b            ; Base Address(8)
    45.             dw 0000000000000000b    ; Base Address(16)
    46.             dw 1111111111111111b    ; Segment Limit(16)
    47.         translation_pmode__descriptor3:
    48.             db 00000000b            ; Base Address(8)
    49.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    50.             db 11111000b            ; P(1), DPL(2), S(1), Type(4)
    51.             db 00000000b            ; Base Address(8)
    52.             dw 0000000000000000b    ; Base Address(16)
    53.             dw 1111111111111111b    ; Segment Limit(16)
    54.         translation_pmode__descriptor4:
    55.             db 00000000b            ; Base Address(8)
    56.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    57.             db 11110010b            ; P(1), DPL(2), S(1), Type(4)
    58.             db 00000000b            ; Base Address(8)
    59.             dw 0000000000000000b    ; Base Address(16)
    60.             dw 1111111111111111b    ; Segment Limit(16)
    61.  
    62. translation_pmode__Data32:
    63.  
    64. ; *******************************************************************************
    65. ;                                    С Т Е К
    66. ; *******************************************************************************
    67.  
    68. translation_pmode__Stack16:
    69.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    70.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    71.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    72.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    73.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    74.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    75.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    76.     translation_pmode__StackStart16:
    77.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    78.  
    79. translation_pmode__Stack32:
    80.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    81.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    82.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    83.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    84.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    85.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    86.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    87.     translation_pmode__StackStart32:
    88.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    89.  
    90. rb (1024*1024*1)-1-($-$$)
    91. db 0x00
    Всё верно? Кстати, а как загрузить в регистр GDTR значение где у меня таблица? Там ведь нужно указывать базовый адрес и предел (вроде бы). А как именно указывать, чтобы это попало в GDTR (SGDT/LGDT)?