2012-03-07 4 views
3

В моих попытках понять, как использовать GNU binutils для создания простого загрузчика, используя gas Я столкнулся с вопросом, как вы говорите компоновщик, куда поместить ваши данные, в файл, который использует .org для продвижения счетчика местоположения при сохранении размера файла на 512 байт. Кажется, я не могу найти способ сделать это.Использование директивы .org с данными в разделе .data: В связи с ld

Сборку программа, которая пытается сделать это:

# Author: Matthew Hoggan 
# Date Created: Tuesday, Mar 6, 2012 

.code16      # Tell assembler to work in 16 bit mode 
.section .data 
msg:       # Message to be printed to the screen 
    .asciz "hello, world" 

.section .text 
.globl _start    # Help linker find start of program 
_start: 
    xor %ax, %ax    # Zero out ax register (ah used to specify bios function to Video Services) 
    movw %ax, %ds    # Since ax is 0x00 0x00 use it to set data segment to 0 
    mov $msg, %si    # Use source index as pointer to string 

loop: 
    movb %ds:(%si), %al  # Pass data to BIOS function in low nibble of ax 
    inc %si     # Advance the pointer 
    or %al, %al    # If byte stored in al is equal to zero then... 
    jz _hang     # Zero signifies end of string 
    call print_char   # Print current char in al 
    jmp loop     # Repeat 

# 
# Function that uses bios function calls 
# to print char to screen 
# 
print_char: 
    movb $0x0e, %ah    # Function to print a character to the screen 
    movb $0x07, %bl    # color/style to use for the character 
    int $0x10     # Video Service Request to Bios 
    ret 

# 
# Function used as infinite loop 
# 
_hang: 
    jmp _hang 

.org 510 
.byte 0x55, 0xAA 

.end 

UPDATE Используя следующие команды я получаю следующее сообщение об ошибке:

[email protected]:~/Code/svn_scripts/assembly/bootloader/gas$ ld --oformat binary -o string string.o 
string.o: In function `_start': 
(.text+0x5): relocation truncated to fit: R_X86_64_16 against `.data' 
+0

Минимальный пример, который генерирует эту ошибку и что она означает: http://stackoverflow.com/a/32639540/895245 Репозиторий с рабочим загрузочным сектором + примеры BIOS: https://github.com/cirosantilli/x86-bare- metal-examples –

ответ

4

Для такого рода работы вы должны написать свой собственный linker script. Просто передайте его компоновщику с опцией -T.

Мой сценарий для почти идентичной проблемой было:

SECTIONS 
{ 
    . = 0x1000; 
    bootsec : 
    { 
     *(.text) 
     *(.data) 
     *(.rodata) 
     *(.bss) 
     endbootsec = .; 
     . = 0x1FE; 
     SHORT(0xAA55) 
    } 
    endbootsecw = endbootsec/2; 
    image = 0x1200; 
} 

С этим трюком вы не делаете событие нужно поставить 0x55 0xAA в ассемблере!

0x1000 в начале: На самом деле все скачки являются относительными, так что не используется, но он необходим в дальнейшем для прыжка в защищенный режим ...

endbootsecw, endbootsec и image являются символы, используемые в других местах в коде.

+0

Я получаю: 'a.ld: 11 не может перемещать указатель местоположения назад (от 0000000000001200 до 00000000000011fe)' с помощью этого сценария компоновщика на Binutils 2.24. –

+0

"делают мой уловщик-переводчик и вещь .org одновременно" DOH! –

 Смежные вопросы

  • Нет связанных вопросов^_^