x86 значения регистра - PullRequest
       19

x86 значения регистра

2 голосов
/ 23 января 2012

Учитывая следующую сборочную линию AT & T x86-64:

cmpl $0x7,0xc(%rsp)

Это обращение к 12-му смещению от $ rsp в памяти.Так получается ли у него 12*4 = 48, 48-й байт после rsp в памяти или 12*8 = 96 96-й байт после rsp?Поскольку это 64-битная архитектура, то регистр будет иметь длину 8 байт и, следовательно, 96?

В любом случае, чтобы получить доступ к этой позиции в gdb, я бы сделал x/96s $rsp?Есть ли простой способ напечатать это без полного списка смещений?

Если я напишу x/12s $rsp, то я получу адреса памяти от 0x7FFFFFFFE1F0 до 0x7FFFFFFFE20D.Таким образом, разница смещения между началом и концом составляет 29 байтов.Как это логично, когда я указал 12?

Спасибо

1 Ответ

4 голосов
/ 23 января 2012

Смещение в сборке является байтовым смещением, поэтому инструкция просматривает данные на 12 байтов выше rsp.Это связано с тем, что x86 разрешает доступ к любому адресу, за исключением инструкций SSE, для некоторых из которых требуется выравнивание по 16 байт.

В gdb число после / указывает, сколько фрагментов данных вы хотитечтобы увидеть, а не смещение.Если вы хотите сместить регистр, вам нужно добавить его в расположение.Кроме того, вы видите 30 байтов, потому что вы используете спецификатор типа s, что означает, что GDB показывает вам строку с нулевым символом в конце.Чтобы увидеть данные, вам нужно использовать другой формат.Некоторые параметры: o (восьмеричное), x (шестнадцатеричное), d (десятичное), t (двоичное) и i (инструкция).(Используйте help x, чтобы увидеть полный список).Вы также должны указать размер данных, которые вы хотите видеть для любого из числовых типов.Используйте b (байт), h (2 байта), w (4 байта) или g (8 байт).

Например, если вы хотите увидеть 2 4-байтовые слова, начинающиеся через 12 байтов после rsp, и показанные в шестнадцатеричном формате, вы должны использовать:

x/2wx $rsp + 12
...