OSDev

для всех
Текущее время: 27 апр 2024, 09:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 17 сен 2012, 20:58 
Аватара пользователя

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
У меня есть код:
Код:
int i=0xABCDEF;


void DoIt()
  {
    int a;
    a=100;
  }

void kmain()
  {
    int j;
    j=i+1;
    DoIt();
  }


Я его компилирую:
Код:
   gcc -m32 -c kmain.c -o obj/kernel.o
   ld -mi386linux  --oformat=binary -Ttext=0x100000 -o bin/kernel -O binary -M -N obj/kmain.o > lst/kernel.mem


И получаю:
Код:
push ebp
mov ebp, esp
sub esp, 0x4
mov eax, 0x64
mov [ebp-0x4], eax
leave
ret
push ebp
mov ebp, esp
sub esp, 0x4
mov eax, [0x100060]
add eax, 0x1
mov [ebp-0x4], eax
call dword 0x0;КАКОГО???
leave
ret
add [eax], al
add [eax], al
add [eax], al
add [eax], al
add [eax], al
add [eax], al
add [eax], al
add [eax], al
add bh, ch
int 0xab
invalid

Три дня на одном месте топчусь.
Подскажите, пожалуйста, как быть.

_________________
Found a CPU. LAPIC ID: 00


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 сен 2012, 17:21 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
418ImATeapot писал(а):
Я его компилирую:
Код:
   gcc -m32 -c kmain.c -o obj/kernel.o
   ld -mi386linux  --oformat=binary -Ttext=0x100000 -o bin/kernel -O binary -M -N obj/kmain.o > lst/kernel.mem


Отличная идея: первая строчка генерит obj/kernel.o , а вторая берёт на вход obj/kmain.o .
Где связь между строчками? Они же работают с разными файлами.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 сен 2012, 12:52 
Аватара пользователя

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
Nable писал(а):
418ImATeapot писал(а):
Я его компилирую:
Код:
   gcc -m32 -c kmain.c -o obj/kernel.o
   ld -mi386linux  --oformat=binary -Ttext=0x100000 -o bin/kernel -O binary -M -N obj/kmain.o > lst/kernel.mem


Отличная идея: первая строчка генерит obj/kernel.o , а вторая берёт на вход obj/kmain.o .
Где связь между строчками? Они же работают с разными файлами.

Спасибо, исправил.
Все равно, call dword 0x0.

_________________
Found a CPU. LAPIC ID: 00


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 сен 2012, 20:24 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
А что не так? Разбираешь, поди, командой типа
Код:
objdump -b binary -m i386 -Mintel -D kernel.bin

В бинарнике ни слова про базовый адрес, в параметрах ты его тоже не указал, так что objdump принимает его равным нулю.
А в call'ах используются относительные адреса (смещения которые надо прибавить к указателю инструкций), вот и получается:
Код:
$ objdump -b binary -m i386 -Mintel -D kernel.bin

kernel.bin:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   55                      push   ebp
   1:   89 e5                   mov    ebp,esp
   3:   83 ec 10                sub    esp,0x10
   6:   c7 45 fc 64 00 00 00    mov    DWORD PTR [ebp-0x4],0x64
   d:   c9                      leave
   e:   c3                      ret
   f:   55                      push   ebp
  10:   89 e5                   mov    ebp,esp
  12:   83 ec 10                sub    esp,0x10
  15:   a1 48 00 10 00          mov    eax,ds:0x100048
  1a:   83 c0 01                add    eax,0x1
  1d:   89 45 fc                mov    DWORD PTR [ebp-0x4],eax
  20:   e8 db ff ff ff          call   0x0
  25:   c9                      leave
  26:   c3                      ret


Ну вот я за тебя внимательно прочёл man objdump и вот чего получил:
Код:
$ objdump -b binary -m i386 -Mintel --adjust-vma=0x100000 -D kernel.bin

kernel.bin:     file format binary


Disassembly of section .data:

00100000 <.data>:
  100000:       55                      push   ebp
  100001:       89 e5                   mov    ebp,esp
  100003:       83 ec 10                sub    esp,0x10
  100006:       c7 45 fc 64 00 00 00    mov    DWORD PTR [ebp-0x4],0x64
  10000d:       c9                      leave
  10000e:       c3                      ret
  10000f:       55                      push   ebp
  100010:       89 e5                   mov    ebp,esp
  100012:       83 ec 10                sub    esp,0x10
  100015:       a1 48 00 10 00          mov    eax,ds:0x100048
  10001a:       83 c0 01                add    eax,0x1
  10001d:       89 45 fc                mov    DWORD PTR [ebp-0x4],eax
  100020:       e8 db ff ff ff          call   0x100000
  100025:       c9                      leave
  100026:       c3                      ret


Мысль ясна?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB