Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm для Linux/Unix > Gnu asm и директива org |
Автор: Dude03 2.1.2007, 00:22 |
Необходимо написать загрузчик, решил писать на gas'e(почему-то он мне нравится ![]() Но возникла проблема с директивой org. Конечно можно обойтись и без нее(какой-нить опцией -Ttext линкера), но хочется добить вопрос. .org addr, fill ![]() В масме по этому все было легко, а as генерит код помойму очень странно: сначала идет "addr" байт "fill", а потом уже мой код. То есть, если напишу .org 0x7c00, 0x20 будет идти 0x7с00 символов с кодом 0x20, а потом мой код. Пробовал по разному извращаться с этой директивой, но не выходит ничего путного=( |
Автор: MAKCim 2.1.2007, 10:25 | ||||
Dude03, .org - дополнение текущей секции до addr байт заданным значением, т. е надо ставить .org после твоего кода в текущей секции так:
Ttext ставишь на 0, entry на boot Добавлено @ 10:25
он реально лучше, согласен ![]() |
Автор: Dude03 2.1.2007, 16:41 | ||
какой-то нехороший прием "делания" правильных адресов. может есть что-то эквивалентное этому(это фасм):
|
Автор: 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 |
судя по всему так и есть. org в фасме/масме/тасме указывает относительно чего считать смещение участка памяти. |