Я работаю в отладчике GDB с целью построения модели стека вызовов для моего исполняемого файла, используя информацию из инструкций по сборке и исходный код, а также знание ввода аргументов. Я знаю, что на расположение данных в стеке чаще всего ссылаются относительно регистров $ EBP или $ ESP для архитектуры x86 (i386). Например, из исходного кода
if argc != 2
{
//do something
}
Несмотря на то, что я довольно новичок в сборке, я могу сделать вывод, что
<main+9> cmp DWORD PTR [ebp+0x8],0x2
составляет часть инструкций по сборке, предназначенных для сравнения статического значения 2 с argc, как это было скомпилировано из исходного фрагмента, приведенного выше. Кроме того, я понимаю, что argc расположен на 8 байтов (два 32-разрядных слова - так как это 32-разрядная виртуальная машина) выше значения регистра $ EBP, помещенного в стек и образующего основу стека. К сожалению, я не понимаю, каково происхождение / базовая линия для относительной ссылки. Относительно верхнего или нижнего адреса слота $ EBP в памяти. Спросил другой способ, когда я печатаю
print $ebp
в ГБД и получим
(void *) 0xbaffe020
в качестве ответа, этот шестнадцатеричный адрес расположен в верхней части 4-байтового слота $ EBP шириной или внизу? Это важно, потому что когда я нахожу расстояние между двумя адресами, мне нужно знать, нужно ли мне добавить еще 4 байта.
- Примечание по терминологии: я часто обозначаю 32-битное (4 байта) слово как «слот» в памяти, потому что нахожу его более интуитивно понятным в моей ментальной модели плоской памяти [по сути, большой массив фиксированной ширины адресуемые «слоты» / диапазоны] -
Кроме того, как я могу согласовать эту относительную схему адресации с синтаксисом DWARF? К сожалению, набрав
info address VARIABLE
в GDB дает относительную адресацию в синтаксисе DWARF, например,
DW_OP_breg4 24
Я знаю, что breg4 ссылается на $ EBP, а fbreg ссылается на $ ESP и что положительные числа смещаются выше в адресе памяти, а отрицательные числа смещаются ниже в адресе памяти, но это так. Какова относительная основа синтаксиса DWARF? Могу ли я использовать другую схему в GDB и вообще избежать DWARF?
Большое вам спасибо.