Как использовать отладчик GDB для просмотра содержимого __asm__? - PullRequest
1 голос
/ 05 апреля 2011

Я пытаюсь понять, что происходит в этом коде, особенно в __asm__.Как мне пройти через ассемблерный код, чтобы я мог напечатать каждую переменную, а что нет?

В частности, я пытаюсь пройтись по этому, чтобы выяснить, что означает 8(), и посмотреть, как онзнать, что он входит в массив с индексом 2.

 /* a[2] = 99 in assembly */
  __asm__("\n\
     movl $_a, %eax\n\
     movl $99, 8(%eax)\n\
");

Ответы [ 3 ]

5 голосов
/ 05 апреля 2011

Команда stepi выполняет сборку по одной инструкции за раз. Существует также nexti для перехода по вызовам функций. Эти команды не придерживаются правила «тип: достаточно только одного префикса команды», которое работает для большинства команд - частично потому, что они next и step команды являются полностью префиксами этих команд, а частично потому, что они не используются слишком часто, и когда они используются, они обычно используются кем-то, кто знает, что они действительно хотят использовать их.

info registers отображает много содержимого регистра.

Вы также захотите просмотреть разборку с помощью команды disassemble.

Дополнительная информация обо всех этих командах доступна с помощью команды help, например:

(gdb) help info registers

сообщает вам, что info registers отображает целочисленные регистры и их содержимое, но также сообщает, что если вы введете имя регистра, оно ограничит вывод значением этого регистра:

(gdb) info registers rax
rax            0x0  0

(rax - версия eax для x86_64) Первый столбец - это имя регистра, второй - шестнадцатеричное значение, а третий - целочисленное значение.

Полезно также help для команды disassemble.

Помните, что у GDB есть завершение табуляции для многих команд, и это можно использовать не только для простых команд, хотя много раз он предлагает вам неверные предложения - иногда это полезно.

Включение метки в вашу встроенную сборку позволит вам легко создать точку разрыва в начале.

3 голосов
/ 05 апреля 2011

Я никогда не был хорош в синтаксисе AT & T, но я почти уверен, что часть 8(%eax) означает «адрес через 8 байтов после адреса, сохраненного в EAX», то есть это смещение относительно адреса, сохраненного врегистр.

Примерный эквивалент в синтаксисе Intel был бы примерно таким (не в моей голове, поэтому вполне возможно, что здесь есть небольшая ошибка ...)

mov eax, a
mov DWORD PTR [eax+8], 99
1 голос
/ 05 апреля 2011
movl $_a, %eax      // load the memory address of a into %eax

movl $99, 8(%eax)   // jump 8 bytes and store number 99 (which is a[2])

Мне кажется, что a - это массив int ( int имеет 4 байта на большинстве платформ). Таким образом, увеличивая 4 байта, вы получите доступ к следующему элементу массива. Другими примерами присвоения значений этому массиву могут быть:

movl $10, (%eax)   // store number 10 on the the first position: a[0]

movl $20, 4(%eax)  // jump 4 bytes from the address loaded in %eax 
                   // and store number 20 on the next position (a[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...