Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Linux/Unix > Адресация в 64 разрядной системе.


Автор: Хоббит 14.8.2011, 19:24
Решил вспомнить работу с 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 это уже символы в обратном порядке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)