Первая статья по сборке:Любовь, любовь, этот регистр немного интересен
Всем привет, я программист cxuan! Мы узнали об основных регистрах в прошлой статье, а в этой статье давайте проделаем настоящую операцию.
Оригинальная ссылка:Научите вас, как скомпилировать Debug
В будущем мы будем использовать множество команд отладки, поэтому давайте сначала ознакомимся с ними.
что такое отладка
Отладка — это функция, предоставляемая операционными системами Windows/Dos. Использование отладки позволяет нам легко просматривать значения и память различных регистров ЦП, чтобы мы могли отлаживать инструкции и отслеживать запущенный процесс программы.
Далее мы будем использовать много команд отладки, но предпосылка использования этих команд заключается в том, что вам нужно установить отладку на свой компьютер, Windows/Mac можно установить, и я нашел для вас ссылку. Ах, забыл упомянуть, мы используем здесьDos boxмоделировать рабочую среду сборки.
Портал (как Mac, так и Windows):Woohoo. Dos box.com/download. С ...
После завершения загрузки откройте DosBox, и он будет выглядеть так.
На этом этапе, когда мы вводим команду отладки, подсказка должна быть
Поскольку мы еще не подключились и не смонтировали, на этом этапе мы выполняем
mount c D:\debug
При выполнении этой команды вам нужно создать папку отладки на диске D, а затем смонтировать ее под отладкой.
и выполнитьC:
Переключитесь на путь диска C.
На этом этапе мы можем выполнить команду отладки.
Здесь следует отметить, что когда я настраивал среду отладки в Windows 10, я ввел отладку после завершения установки, и она все еще предлагалаIllegal command:debug, в это время вам нужно скачать еще один debug.exe , я также дам вам адрес загрузки.
ссылка для скачивания:disk.baidu.com/is/177A RSA34…Пароль: 3akd
нужно скачатьdebug.exe, а затем поместите его в путь, по которому вы его монтируете, здесь путь, который я монтирую, — это папка отладки на диске D.
После завершения размещения снова введите отладку.
Поскольку приведенные выше команды выполняются каждый раз при открытии Dosbox, это действительно раздражает, так что же мне делать? Простой способ — найти его по пути установки Dosbox.
После открытия в конце введите
Все в порядке. В следующий раз, когда я открою Dosbox напрямую, эти три команды будут выполняться по умолчанию. Пока это все проблемы, с которыми я столкнулся при сборке Dosbox.
Отладочный бой
Играя со сборкой, нужно научиться использовать отладку, отладка — это своего родаОтладчик, Через Debug мы можем посмотреть значение памяти, отследить ситуацию в стеке, посмотреть содержимое, временно хранящееся в реестре и т.д., а также помочь нам лучше понять ассемблерный код, так что изучайте Debug,Очень важно, что является незаменимой практической способностью.
Ниже мы будем использовать несколько команд отладки, вот краткое введение.
Существует много команд отладки, но это наиболее часто используемые.
Ну а теперь переходим непосредственно к теме и запускаем официальную операцию Debug на Dosbox, предварительно открыв Dosbox.
В порядке. . . . . . Мы открывали этот интерфейс много раз.
А если я напишу приказ? Ну, я еще не продемонстрировал, вот оно!
Debug -r
дорогая, пользуйсяDebug -rВы можете просматривать и изменять содержимое регистров ЦП.
Посмотреть содержимое реестра.
Здесь нужно обратить внимание на регистр -r.Debug -r для просмотра содержимого регистра. И -R - недопустимая инструкция.
Регистров, перечисленных на рисунке выше, очень много.Вы можете почувствовать, что не можете начать.Не перепутайте.Начнем с самых основных,то есть CS и IP.CS(Code Segment) is регистр сегмента кода, который также обычно называют базовым адресом сегмента. , можно рассматривать как точку входа для доступа к программе. ЦП должен выяснить, с какой позиции начать выборку и выполнение из CS, но мы по-прежнему этого не делаем. t знает, какой сегмент выбрать.В это время роль IP отражается.IP (Instruction Pointer) является инструкцией Регистр указателя, также известный как адрес смещения, сообщает нам, какой адрес сегмента брать из базового адреса сегмента.
Адрес сегмента base:offset может использоваться для определения указанного адреса в памяти.
Здесь мы лишь вкратце расскажем о концепции этих двух регистров.Чтобы понять конкретные функции этих двух регистров, вы можете прочитать предыдущую статью автора.
Использование -r также может изменить содержимое регистра, как показано ниже.
-r Общий формат-r зарегистрироваться, а затем система предложит двоеточие, за которым следует содержимое, которое вы хотите изменить.
Debug -d
Используйте команду -d для просмотра содержимого памяти.
По умолчанию значение выходной памяти начинается с адреса CS:IP.Поскольку значение по умолчанию CS равно 073F, а значение по умолчанию IP равно 0100, значение памяти -d равно 073F:0100.
Существует множество форматов -d, и ниже представлены лишь некоторые из них.
Как -d 1000:0 это-d адрес базового смещения сегментаФормат может производить следующий вывод.
Как показано на рисунке выше, Debug отобразит содержимое указанного блока памяти. Каждый 00 на приведенном выше рисунке представляет 8 битов.Если это 4A, то эти восемь битов расширяются до 0010 1011 . Каждая строка имеет 16 8-битных, поэтому она составляет 128-битный адрес памяти.
Почему все 00, потому что значение блока памяти не перезаписано, грубо говоря, в этой области памяти нет значения, как его перезаписать и переработать потом.
В середине каждой строки есть-
, это настроено для чтения, есть 8 блоков памяти до и после знака -, поэтому его легко просмотреть.
Несколько справа... представляют собой символы ASCII, которые могут отображаться каждым блоком памяти.Поскольку память не имеет значения, нет соответствующего кода ASCII. Мы можем посчитать, в каждой строке 16 ., что означает, что каждый 00 соответствует ASCII-коду.
Мы можем использовать -d 1000:9 для этого-d базовый адрес сегмента: начальный адрес смещенияформат для отображения числа, начиная с 1000.
Отладка начинается с 1000:9 и заканчивается на 1000:88, всего 128 байт, а содержимое 1000:0~1000:8 в первой строке не отображается.
Вы также можете использовать -d 1000:0 9 это-d базовый адрес сегмента: адрес начального смещения адрес конечного смещенияформат для вывода.
Также можно использовать адрес смещения -d для просмотра значения памяти без указания базового адреса сегмента.
Debug -e
Вышеупомянутое предназначено для просмотра значения указанного места или области в памяти.Давайте перепишем значение памяти.
использовать-e
Значение памяти может быть перезаписано.Например, если мы хотим перезаписать содержимое в 1000:0 ~ 1000:f, мы можем использовать -e 1000:0 0 1 2 3 4 5 6 7 8 9 0 abcdef таким образом, как показано на следующем рисунке.
Здесь следует отметить, что при перезаписи -e в середине каждого значения есть пробел, если пробела нет, то оно будет рассматриваться как значение в памяти.
Затем используйте -d 1000:0, чтобы увидеть значение памяти, которое мы только что перезаписали.
Вопросы также можно использовать для изменения содержимого ячеек памяти, начиная с адреса, одну за другой.
Или используйте в качестве примера 1000:100, выведите -e 1000:100 и нажмите Enter.
Как показано на рисунке выше, вы можете видеть, что мы сначала ввели команду -e 1000:100 один раз, а затем нажали клавишу Enter.
Обратите внимание, что если вы нажмете здесь клавишу Enter, это будет эквивалентно завершению всего процесса перезаписи -e.
Если вы хотите продолжить перезапись значения в памяти позже, вам нужно нажать пробел.
Мы перезаписываем значение памяти после 1000:100, затем используем -d 1000:100, чтобы увидеть, вступит ли наша перезапись в силу.
Команда -e также может поддерживать запись символов, например, мы можем начать записывать значения и символы в позицию 1000:0, -e 1000:0 1 'a' 2 'b' e 'c' .
Как показано на рисунке выше, когда мы записываем в память символы 'a', 'b', 'c', они будут автоматически преобразованы в код ASCII для хранения, а только что записанный символ можно найти в крайнем правом углу.
Debug -u
Как записать кусок машинного кода в память? Например, мы хотим записать в память кусок машинного кода.
Мы можем использовать -e для записи машинного кода b8 01 00 b9 02 00 01 c8 в память, как показано ниже.
После того, как мы используем -e для записи, используем -d для просмотра значения памяти, мы можем найти значение, которое мы только что записали, но мы не можем видеть машинный код, так как же следует читать машинный код?
Не волнуйтесь, есть еще команда -u, она предназначена для просмотра машинного кода, как показано на рисунке ниже, мы используем команду -u для отображения машинного кода, который мы написали.
Вы можете видеть, что адрес памяти 1000:0000 ~ 1000:0006 заставляет нас написать машинный код Команда -u переводит содержимое блока памяти в ассемблерные инструкции и отображает их.
Результаты вывода -u отображаются в трех частях:
- Крайний левый — это адрес каждой машинной инструкции;
- Посередине машинные инструкции;
- Справа — инструкции по сборке, выполняемые машинными инструкциями.
В 1000:0 хранится машинная инструкция, состоящая из написанного машинного кода B8 01 00, и соответствующая ассемблерная инструкция MOV AX,0001.
По адресу 1000:0003 хранится машинная инструкция, состоящая из написанного машинного кода B9 02 00, и соответствующая ассемблерная инструкция MOV CX,0002.
По адресу 1000:0006 хранится машинная инструкция, состоящая из написанного машинного кода C1 C8, и соответствующая ассемблерная инструкция add ax,cx.
Debug -t
Ряд инструкций, представленных выше, включая машинный код Debug -e, о котором мы упоминали выше, все записываются в память, так как же выполнить эти инструкции?
Мы можем использовать Debug -t для выполнения письменных инструкций. Используйте Debug -t для выполнения инструкции, на которую указывает CS:IP.
Поскольку -t может выполнять команды, на которые указывает CS:IP, нам необходимо указать CS:IP на 1000:0 (поскольку мы написали команду на 1000:0 ранее).
Сначала нам нужно выполнить -r cs 1000 , -r ip 0 присваивает CS:IP значение 1000:0.
Затем выполните команду -t.На следующем рисунке показан скриншот выполненной команды.
Видно, что после выполнения инструкции -t выполняется инструкция MOV AX,0001, и текущее содержимое регистра AX становится равным 0001. Эта ассемблерная инструкция означает перемещение 0001 в регистр AX.
После продолжения с -t мы можем увидеть изменения регистра.
Debug -a
В конце концов, машинные инструкции не так просто понять, и их очень неудобно писать, так есть ли способ поддержать нас, чтобы мы писали инструкции по ассемблеру напрямую? Действительно, Debug предоставляет -a такой способ реализации написания ассемблерных инструкций. Как показано ниже
Как видите, мы использовали команду -a для записи в 1000:0, введите команды mov ax, 1 mov bx, 2 mov cx, 3 add ax, bx add ax, cx add ax,ax соответственно, а затем нажмите назад Автомобиль подтвержден к исполнению.
Мы используем -d 1000:0 f, чтобы увидеть f-ю инструкцию памяти, начинающуюся со смещения 0 (поскольку самый большой адрес записи — это просто f).
Почему 1000:000F на приведенном выше рисунке имеет значение, ведь мы уже выполнили эту запись выше.
В качестве альтернативы используйте -a, чтобы начать вводить команды с предустановленного адреса.
Суммировать
Сегодня я говорил с вами об основах использования Debug, в основном включая
- -r Просмотр и изменение содержимого реестра
- -d Просмотр инструкций в памяти
- -e изменить содержимое памяти
- -u может интерпретировать содержимое памяти как машинные инструкции и соответствующие ассемблерные инструкции
- -t выполнить команду в CS:IP
- -а запись в память в собранном виде
Существует множество вариантов инструкций по сборке, вышеприведенные инструкции являются часто используемыми инструкциями, и этими инструкциями нужно умело пользоваться.
Наконец, я рекомендую свой собственныйGithub, в ней много хардкорных статей, которые обязательно вам помогут.