К счастью, в основных операционных системах используется плоская модель памяти, поэтому обе базы DS и ES - 0
. «Адрес», который вам нужен, - это просто часть смещения полного адреса seg: off.
Чтобы проверить память в источнике, перед копированием, x $esi
.
В настраиваемом ядре защищенного режима с ненулевой базой DS или ES (которую вы отлаживаете через QEMU?) Вам придется вручную определять базы сегментов. x86 не имеет простого способа запросить его; эта часть архитектурного состояния не читается, а доступна только для записи (загружается из GDT или LDT, когда вы записываете сегментный регистр с помощью селектора). Некоторые люди называют внутренние регистры базовых / предельных значений сегмента «кешами», но это не так. Они гарантированно сохранят свои значения, даже если вы измените запись GDT, пока вы вручную не mov ds, eax
или что-то еще.
GDB вообще не знает о сегментации, если вы хотите отлаживать код с помощью модель сегментированной памяти, используйте встроенный отладчик BOCHS.