Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Адресация в 64 разрядной системе. 
V
    Опции темы
Хоббит
Дата 14.8.2011, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



Решил вспомнить работу с gdb. (Linux 64)

Вот простая программа 

Код

#include <unistd.h>

int main(int argc, char* argv[])
{
        char str[] = "Hello, world!\n";
        write(1, str, sizeof(str) - 1);
        _exit(0);
}


Собираем, запускаем gdb, выводим код

Код

gcc -g -o hello hello.c
gdb -q ./hello
Reading symbols from /home/kirichenko/tmp/asm/hello...done.
(gdb) break main
Breakpoint 1 at 0x400543: file hello.c, line 5.
(gdb) run 
Starting program: /home/kirichenko/tmp/asm/hello 

Breakpoint 1, main (argc=1, argv=0x7fffffffe298) at hello.c:5
5               char str[] = "Hello, world!\n";
(gdb) disassemble main
Dump of assembler code for function main:
   0x0000000000400534 <+0>:     push   %rbp
   0x0000000000400535 <+1>:     mov    %rsp,%rbp
   0x0000000000400538 <+4>:     sub    $0x20,%rsp
   0x000000000040053c <+8>:     mov    %edi,-0x14(%rbp)
   0x000000000040053f <+11>:    mov    %rsi,-0x20(%rbp)
=> 0x0000000000400543 <+15>:    movl   $0x6c6c6548,-0x10(%rbp)
   0x000000000040054a <+22>:    movl   $0x77202c6f,-0xc(%rbp)
   0x0000000000400551 <+29>:    movl   $0x646c726f,-0x8(%rbp)
   0x0000000000400558 <+36>:    movw   $0xa21,-0x4(%rbp)
   0x000000000040055e <+42>:    movb   $0x0,-0x2(%rbp)
   0x0000000000400562 <+46>:    lea    -0x10(%rbp),%rax
   0x0000000000400566 <+50>:    mov    $0xe,%edx
   0x000000000040056b <+55>:    mov    %rax,%rsi
   0x000000000040056e <+58>:    mov    $0x1,%edi
   0x0000000000400573 <+63>:    callq  0x400428 <write@plt>
   0x0000000000400578 <+68>:    mov    $0x0,%edi
   0x000000000040057d <+73>:    callq  0x400418 <_exit@plt>
End of assembler dump.


Дальше я выполняю несколько раз ni, чтобы в rbp - 0x10 и ниже записалось несколько адресов. На сколько я понимаю, где то среди этих адресов должен быть адрес на строку Hello, world. Но почему то не могу посмотреть память

Код

// 5 раз ni
(gdb) x/4xw $rbp - 0x10
0x7fffffffe1a0: 0x6c6c6548      0x77202c6f      0x646c726f      0x00000a21 // Я вижу те самые адресса
(gdb) x/s 0x6c6c6548
0x6c6c6548:      <Address 0x6c6c6548 out of bounds>
(gdb) x/s 0x77202c6f
0x77202c6f:      <Address 0x77202c6f out of bounds>
(gdb) x/s 0x646c726f
0x646c726f:      <Address 0x646c726f out of bounds>


Но посмотреть, что в них не могу. Раньше не работал с gdb на 64 разрядной машине. Сейчас же не пойму, где мне найти мой hello world.

Добавлено @ 19:36
Нашел. Оказывается строка на прямую пишется. 0x6c6c6548 это уже символы в обратном порядке.

Это сообщение отредактировал(а) Хоббит - 14.8.2011, 19:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Linux/Unix"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Linux/Unix | Следующая тема »


 




[ Время генерации скрипта: 0.0956 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.