===== GDB ===== Подробнее [[http://wasm.ru/article.php?article=asm_linux_for_c#chapter.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 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: ... 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**