OSDev

для всех
Текущее время: 05 май 2024, 12:24

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: GNU Assembler и защищенный режим
СообщениеДобавлено: 02 сен 2010, 21:00 

Зарегистрирован: 02 сен 2010, 20:49
Сообщения: 2
Здравствуйте! Взял я готовый пример на nasm'е, рабочий, проверял. Перевел на gas - не работает.
Код:
[BITS 16]
[ORG 0x7c00]
_start:   
   cli
   mov ax, cs
   mov ds, ax
   mov ss, ax
   mov sp, _start

   ;; Загрузка регистра GDTR:   
   lgdt [gd_reg]

   ;; Включение A20:
   in al, 0x92
   or al, 2
   out 0x92, al

   ;; Установка бита PE регистра CR0
   mov eax, cr0
   or al, 1   
   mov cr0, eax 

   ;; С помощью длинного прыжка мы загружаем
   ;; селектор нужного сегмента в регистр CS
   ;; (напрямую это сделать нельзя)
   ;; 8 (1000b) - первый дескриптор в GDT, RPL=0
   jmp 0x8: _protected


[BITS 32]
_protected:   
   ;; Загрузим регистры DS и SS селектором
   ;; сегмента данных
   mov ax, 0x10
   mov ds, ax
   mov ss, ax

   mov esi, msg_hello
   call kputs   

   ;; Завесим процессор
   hlt
   jmp short $


cursor:   dd 0
%define VIDEO_RAM 0xB8000

;; Функция выполняет прямой вывод в память видеоадаптера
;; которая находится в VGA-картах (и не только) по адресу 0xB8000
   
kputs:
   pusha
.loop:   
   lodsb
   test al, al
   jz .quit

   mov ecx, [cursor]
   mov [VIDEO_RAM+ecx*2], al
   inc dword [cursor]
   jmp short .loop

.quit:   
   popa
   ret
      

gdt:
   dw 0, 0, 0, 0   ; Нулевой дескриптор

   db 0xFF      ; Сегмент кода с DPL=0
   db 0xFF      ; Базой=0 и Лимитом=4 Гб
   db 0x00
   db 0x00
   db 0x00
   db 10011010b
   db 0xCF
   db 0x00
   
   db 0xFF      ; Сегмент данных с DPL=0
   db 0xFF      ; Базой=0 и Лимитом=4Гб   
   db 0x00   
   db 0x00
   db 0x00
   db 10010010b
   db 0xCF
   db 0x00


   ;; Значение, которое мы загрузим в GDTR:   
gd_reg:
   dw 8192
   dd gdt

msg_hello:   db "Hello from the world of 32-bit Protected Mode",0

   times 510-($-$$) db 0
   db 0xaa, 0x55

На gas'е:
Код:
.file "boot.s"
.text
.code16
.globl _start
_start:
   cli
   mov %cs, %ax
   mov %ax, %ds
   mov %ax, %ss
   mov $_start, %sp
   lgdt gd_reg

   in $0x92, %al
   or $2, %al
   out %al, $0x92

   mov %cr0, %eax
   or $1, %al
   mov %eax, %cr0

   ljmp $0x8, $_prot

.code32
_prot:
   mov $0x10, %ax
   mov %ax, %ds
   mov %ax, %ss
   mov $hello_msg, %esi
   call kputs
   hlt
kputs:
   pusha
.loop:
   lodsb
   test %al, %al
   jz .quit
   mov cursor, %ecx
   mov %al, 0xb8000(,%ecx,2)
   incl cursor
   jmp .loop
.quit:
   popa
   ret

gdt:
   .word 0, 0, 0, 0

   .byte 0xFF
   .byte 0xFF
   .byte 0
   .byte 0
   .byte 0
   .byte 0b10011010
   .byte 0xCF
   .byte 0x00

   .byte 0xFF
   .byte 0xFF
   .byte 0
   .byte 0
   .byte 0
   .byte 0b10010010
   .byte 0xCF
   .byte 0x00

gd_reg:
   .word 8192
   .long gdt
cursor:
   .long 0
hello_msg:
   .ascii "OS is loading...\0"
.org 510
.word 0xAA55

Сначала пытался импровизировать, но ничего не работало, потом просто переписал, и все равно не работает - пустой экран. Что я делаю не так, помогите?
Да, собираю так:
Код:
as -g -o boot.o boot.s
ld --oformat binary -Ttext 0x0 -o boot.img boot.o

Как бы хоть понять, где ошибка: при переходе в защищенный режим или при записи в видеопамять?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GNU Assembler и защищенный режим
СообщениеДобавлено: 02 сен 2010, 22:32 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
А не пробовали смотреть в дизассемблере код, полученный обоими способами? Ну а знатоков ГАСа найти трудно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GNU Assembler и защищенный режим
СообщениеДобавлено: 03 сен 2010, 05:28 

Зарегистрирован: 02 сен 2010, 20:49
Сообщения: 2
Все, разобрался, кажется. Надо было линковать так: ld --oformat binary -Ttext 0x7c00 -o boot.img boot.o
Да, спасибо, дизассемблер помог. Я как-то сам не догадался даже посмотреть :)

Для меня остается загадкою, почему все чудесно работало в реальном 16-битном режиме, когда я линковал -Ttext 0?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GNU Assembler и защищенный режим
СообщениеДобавлено: 03 сен 2010, 10:26 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
А чего там не работать? Никаких зависимостей от реального положения кода там нет, вот и работало. Первая зависящая от положения команда -- это дальний jmp, уже после перехода в защищёнку.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB