Подробнее здесь; на текущей странице представлена сжатая версия для занятия с учётом специфики ассемблера 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)
Далее можно использовать следующие команды:
Кроме регистров у нас есть память, и частный случай памяти — стек. Как их посмотреть? Команда 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