Относительная адресация в сборке x86 (разновидность intel), смещения даны относительно вершины или основания "слота"? - PullRequest
0 голосов
/ 14 сентября 2018

Я работаю в отладчике 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? Большое вам спасибо.

1 Ответ

0 голосов
/ 14 сентября 2018

После создания традиционного стекового кадра с push ebp / mov ebp, esp при входе в функцию EBP указывает на основание значения сохраненного вызывающего абонента-EBP.

Таким образом, EBPуказывает на 4 байта ниже адреса возврата и на 8 байтов ниже первого аргумента стека (именно поэтому вы найдете argc в [ebp+8].

. В общем, адреса указывают внизу / в начале байтов объекта. Указатель на объект такой же, как указатель на первый байт объекта. (X86 - little-endian, это наименее значимый байт.)

...