AccessD Опубликовано 2 февраля, 2007 Жалоба Поделиться Опубликовано 2 февраля, 2007 примитивный загрузчик. суть кода - перетаскиваю загрузчик в новое место и записываю в 0x7c00 первый сектор нулевого цилиндра нулевой головки, после чего перехожу туда и гружусь. Цитата: .code16 .text .globl _start _start: movw $0x0, %ax movw %ax, %cs movw %ax, %ss movw %ax, %ds movw %ax, %es movw %ax, %ds movw $0x7c00, %si movw %si, %sp movw $0x600, %di cld mov $0x100, %cx repne movsw movw $0x600, %ax add $cont, %ax push %ax ret cont: movw $0x7c00, %bx movb $0x2, %ah movb $0x1, %al movb $0x1, %cl movb $0x0, %ch movb $0x80, %dl movb $0x0, %dh int $0x13 ljmp $0x0, $0x7c00 всё просто, собираю объектник accessd@deck:~/src> gcc -c boot.s а вот при линковке линкер выдаёт: accessd@deck:~/src> ld -o boot.bin boot.o boot.o: In function `_start': (.text+0x1f): relocation truncated to fit: R_386_16 against `.text' чего он выпендривается? всё примитивно, причём такой же код при помощи as86 + ld86 собирается и линкуется без проблем, но я привык к AT&T синтаксису и хочу сделать это при помощи gas. Может, кто знает,как побороть это? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
AccessD Опубликовано 2 февраля, 2007 Автор Жалоба Поделиться Опубликовано 2 февраля, 2007 понял, в чём дело - у gas'а проблемы с реальным режимом, тут надо подходить очень осторожно, так как gas может изменить инструкции с 16 разрядной адресацией на 32 разрядные. загнал объектник в дизассемблер, а там фигня какая-то, не удивительно, что линкеру не нравится. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
EL[michlen] Опубликовано 3 февраля, 2007 Жалоба Поделиться Опубликовано 3 февраля, 2007 И как решил? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
AccessD Опубликовано 3 февраля, 2007 Автор Жалоба Поделиться Опубликовано 3 февраля, 2007 пока решаю - копаюсь в загрузочных исходниках ядра, смотрю как там gas используется в реальном режиме. а после сборки объектника as86, ld86 не линкует, сообщая, что magic number не правильный. с gas'ом такой фокус - адреса чёрт знает во что превратились, некот.команды превратились в белиберду: Цитата: Disassembly of section .text: 00000000 <_start>: 0: 31 c0 xor %eax,%eax 2: 8e c8 movl %eax,%cs 4: 8e d0 movl %eax,%ss 6: 8e d8 movl %eax,%ds 8: 8e c0 movl %eax,%es a: 8e d8 movl %eax,%ds c: be 00 7c 89 f4 mov $0xf4897c00,%esi 11: bf 00 06 fc b9 mov $0xb9fc0600,%edi 16: 00 01 add %al,(%ecx) 18: f2 a5 repnz movsl %ds:(%esi),%es:(%edi) 1a: b8 00 06 05 22 mov $0x22050600,%eax 1f: 00 50 c3 add %dl,0xffffffc3(%eax) 00000022 <cont>: 22: bb 00 7c b4 02 mov $0x2b47c00,%ebx 27: b0 01 mov $0x1,%al 29: b1 01 mov $0x1,%cl 2b: b5 00 mov $0x0,%ch 2d: b2 80 mov $0x80,%dl 2f: b6 00 mov $0x0,%dh 31: cd 13 int $0x13 33: ea .byte 0xea 34: 00 7c 00 00 add %bh,0x0(%eax,%eax,1) в принципе, такой код несложно написать сразу в машинном виде - этакий шел-код, но хочется разобраться. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.