OSDev http://osdev.su/ |
|
GNU Assembler и защищенный режим http://osdev.su/viewtopic.php?f=6&t=335 |
Страница 1 из 1 |
Автор: | Стефан [ 02 сен 2010, 21:00 ] |
Заголовок сообщения: | GNU Assembler и защищенный режим |
Здравствуйте! Взял я готовый пример на 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 Как бы хоть понять, где ошибка: при переходе в защищенный режим или при записи в видеопамять? |
Автор: | SII [ 02 сен 2010, 22:32 ] |
Заголовок сообщения: | Re: GNU Assembler и защищенный режим |
А не пробовали смотреть в дизассемблере код, полученный обоими способами? Ну а знатоков ГАСа найти трудно... |
Автор: | Стефан [ 03 сен 2010, 05:28 ] |
Заголовок сообщения: | Re: GNU Assembler и защищенный режим |
Все, разобрался, кажется. Надо было линковать так: ld --oformat binary -Ttext 0x7c00 -o boot.img boot.o Да, спасибо, дизассемблер помог. Я как-то сам не догадался даже посмотреть :) Для меня остается загадкою, почему все чудесно работало в реальном 16-битном режиме, когда я линковал -Ttext 0? |
Автор: | SII [ 03 сен 2010, 10:26 ] |
Заголовок сообщения: | Re: GNU Assembler и защищенный режим |
А чего там не работать? Никаких зависимостей от реального положения кода там нет, вот и работало. Первая зависящая от положения команда -- это дальний jmp, уже после перехода в защищёнку. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |