Представьте конкретный адрес c выражением - PullRequest
0 голосов
/ 05 августа 2020

Я использую gdb и пытаюсь получить адрес, представленный [es: edi] (или es: [edi]). Как мне это сделать? Инструкция такая:

 rep movs DWORD PTR es:[edi],DWORD PTR ds:[esi]

1 Ответ

0 голосов
/ 05 августа 2020

К счастью, в основных операционных системах используется плоская модель памяти, поэтому обе базы DS и ES - 0. «Адрес», который вам нужен, - это просто часть смещения полного адреса seg: off.

Чтобы проверить память в источнике, перед копированием, x $esi.

В настраиваемом ядре защищенного режима с ненулевой базой DS или ES (которую вы отлаживаете через QEMU?) Вам придется вручную определять базы сегментов. x86 не имеет простого способа запросить его; эта часть архитектурного состояния не читается, а доступна только для записи (загружается из GDT или LDT, когда вы записываете сегментный регистр с помощью селектора). Некоторые люди называют внутренние регистры базовых / предельных значений сегмента «кешами», но это не так. Они гарантированно сохранят свои значения, даже если вы измените запись GDT, пока вы вручную не mov ds, eax или что-то еще.

GDB вообще не знает о сегментации, если вы хотите отлаживать код с помощью модель сегментированной памяти, используйте встроенный отладчик BOCHS.

...