Смещение в сборке является байтовым смещением, поэтому инструкция просматривает данные на 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