мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

GDB

Подробнее здесь; на текущей странице представлена сжатая версия для занятия с учётом специфики ассемблера nasm.

Рассмотрим код:

;Точка входа "_start" на самом деле находится 
;в подключаемом *.o файле стандартной библиотеки Си
;Она передает управление на функцию "main",
;которая должна находиться в нашей программе
	global main
 
;Сегмент кода:
	section .text
 
;Функция main:
	main:
 
	mov	rax,6
	mov	rbx,3
	add	rax,rbx
 
the_end:
	mov	rax,1
	int	0x80
 
	ret

Ассемблируем и собираем программу:

user@host ~/asm/example $ nasm -felf64 example.s -g
user@host ~/asm/example $ gcc example.o -o example -g
user@host ~/asm/example $ 

Запускаем gdb:

user@host ~/asm/example $ gdb ./example
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/user/asm/example/example...done.
(gdb) 

Устанавливаем точки останова:

(gdb) b main
Breakpoint 1 at 0x4004c0
(gdb) b the_end
Breakpoint 2 at 0x4004d7
(gdb) 

Далее можно использовать следующие команды:

  • r – выполнение до точки останова
  • ni или si – пошаговое выполнение
  • p $rax – показать содержимое регистра rax
  • info registers – показать информацию обо всех регистрах

Кроме регистров у нас есть память, и частный случай памяти — стек. Как их посмотреть? Команда x/формат адрес отображает содержимое памяти, расположенной по адресу в заданном формате. Формат это (в таком порядке) количество элементов, буква формата, и размер элемента. Буквы формата: o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char) and s(string). Размер: b(byte), h(halfword), w(word), g(giant, 8 bytes).

Задание

Напишите собственную программу, выполняющую арифметические или логические действия с содержимым регистров. Результат выполнения проконтролируйте с помощью отладчика gdb