Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Linux/Unix > Gnu asm и директива org


Автор: Dude03 2.1.2007, 00:22
Необходимо написать загрузчик, решил писать на gas'e(почему-то он мне нравится smile ).
Но возникла проблема с директивой org. Конечно можно обойтись и без нее(какой-нить опцией -Ttext линкера), но хочется добить вопрос.
.org addr, fill smile 
В масме по этому все было легко, а as генерит код помойму очень странно: сначала идет "addr" байт "fill", а потом уже мой код. То есть, если напишу .org 0x7c00, 0x20 будет идти 0x7с00 символов с кодом 0x20, а потом мой код.  
Пробовал по разному извращаться с этой директивой, но не выходит ничего путного=( 

Автор: MAKCim 2.1.2007, 10:25
Dude03
.org - дополнение текущей секции до addr байт заданным значением, т. е надо ставить .org после твоего кода в текущей секции так:
Код

BOOTMEM    =    0x07C0

.code16
.text
.globl boot
boot:
    ljmp    $BOOTMEM, $start  /* make true address */
start:
...
#ifdef BOOT_FLOPPY
    .org 510
    .word 0xAA55
#else
    .org 446
/* next 512 - 446 bytes forMBR */
#endif

Ttext ставишь на 0, entry на boot
Добавлено @ 10:25 
Цитата

почему-то он мне нравится

он реально лучше, согласен  smile 

Автор: Dude03 2.1.2007, 16:41
Цитата(MAKCim @  2.1.2007,  10:25 Найти цитируемый пост)
ljmp    $BOOTMEM, $start  /* make true address */

какой-то нехороший прием "делания" правильных адресов. 

может есть что-то эквивалентное этому(это фасм):
Код

    org 0x7C00

use16

start:

    cli
    mov ax, cs
    mov ds, ax
    mov ss, ax

Автор: MAKCim 2.1.2007, 17:24
Цитата

какой-то нехороший прием "делания" правильных адресов. 

почему? Все очень даже правильно
по сути после POST BIOS 
вызывается int 19h, считывается 1 сектор и записывается по адресу 0x7C00
туда же и передается управление, т. е CS = 0, IP = 0x7C00 к моменту считывания команды ljmp
т. к при сборке мы указываем Ttext = 0, то нам надо, чтобы и IP команды ljmp был нулем. Для этого и делаем far jump на сегмент с адресом 0x07C0 (адресация реального режима), при этом смещение $start станет равным размеру команды ljmp, т. е мы добились этим переходом того, что ljmp будет лежать по IP = 0
Цитата

может есть что-то эквивалентное этому(это фасм):

org в фасме я подозреваю не то же самое, что .org в AS

Автор: Dude03 2.1.2007, 19:18
Цитата(MAKCim @  2.1.2007,  17:24 Найти цитируемый пост)
org в фасме я подозреваю не то же самое, что .org в AS

судя по всему так и есть. org в фасме/масме/тасме указывает относительно чего считать смещение участка памяти.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)