Jump to content

Recommended Posts

Posted

примитивный загрузчик.

суть кода - перетаскиваю загрузчик в новое место и записываю в 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.

Может, кто знает,как побороть это?

Posted

понял, в чём дело - у gas'а проблемы с реальным режимом, тут надо подходить очень осторожно, так как gas может изменить инструкции с 16 разрядной адресацией на 32 разрядные. загнал объектник в дизассемблер, а там фигня какая-то, не удивительно, что линкеру не нравится.

Posted

пока решаю - копаюсь в загрузочных исходниках ядра, смотрю как там 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)

в принципе, такой код несложно написать сразу в машинном виде - этакий шел-код, но хочется разобраться.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...