_____________________________________________________________________________ Insight, real-mode debugger for MS/PC-DOS Copyright (c) Victor M. Gamayunov, Sergey Pimenov, 1993, 96, 97, 2002 _____________________________________________________________________________ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. _____________________________________________________________________________ Insight 1.10 Краткое описание. Последние изменения - 26.01.2002 Copyright (c) Victor Gamayunov, Sergey Pimenov, 1993, 96, 97, 2002 ──────────────────────────────────────────────────────────────────────── Данное Описание не является детальным и полным руководством для работы с отладчиком. Оно содержит информацию только об основных отличиях и особенностях данного отладчика. Описание рассчитано не на новичка, у которого нет навыков работы с приложениями такого типа. Поэтому здесь приводятся только краткие описания назначения пунктов меню и клавиатурных сокращений и не приводятся основные принципы и методы отладки и "отладки" программ. Отличительные особенности подверсий отладчика описываются в файле whatsnew.txt. Также в этом файле можно найти список исправленных ошибок и перечисление "документированных" ошибок. ──────────────────────────────────────────────────────────────────────── ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 1. ИНТЕРФЕЙС ОТЛАДЧИКА. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ──────────────────────────────────────────────────────────────────────── 1.1. Основные окна отладчика. ──────────────────────────────────────────────────────────────────────── Экран отладчика делится на 5 подокон: окно кода/ассемблера (Code/Assembler window), окно данных (Dump window), окно регистров (Registers window), окно флагов (Flags window) и окно стека (Stack window). Любое из этих окон (кроме окна стека) может быть активным. При этом основным рабочим окном является окно кода. Переход в любое другое окно и вызов основного меню возможен только из окна кода при помощи меню Edit или клавиатурных комбинаций. В Табл. 1.1 приведены соответствующие клавиатурные комбинации и пункты меню. Для возврата к окну кода нужно нажать Esc или Enter. Окно │ Меню │ Комбинация ═════════════╪══════════════════╪══════════════ Assembler │ Edit|Assembler │ Shift+A Dump │ Edit|Dump │ Shift+D Registers │ Edit|Registers │ Shift+R Flags │ Edit|Flags │ Shift+F Табл. 1.1 ──────────────────────────────────────────────────────────────────────── 1.2. Система меню отладчика. ──────────────────────────────────────────────────────────────────────── Система меню отладчика включает в себя основное выпадающее меню и локальные меню окон. Основное меню (Рис. 1.1) в неактивном состоянии скрыто, его можно вызвать и активизировать нажатием клавиши Alt или F10. Работа с меню происходит обычным образом. Локальное меню вызывается нажатием комбинации Alt+F10 при активном соответствующем окне. Подробное описание назначения пунктов основного и локальных меню приводятся в соответствующих разделах, а краткое описание всех меню отладчика - в разделе 3.1. ┌──────┐ │ File │ Edit Run Breakpoints Options Window ├──────┴─────────┐ │ Load... F3 │██ ──── загрузить новую программу в отладчик │ New │██ ──── сброс отладки без загрузки программы ├────────────────┤██ │ About... │██ ──── вывести окно с информацией об отладчике ├────────────────┤██ │ Resident │██ ──── выйти из отладчика, оставив его в памяти │ Exit Alt+X │██ ──── выход из отладчика └────────────────┘██ ██████████████████ ┌──────┐ File │ Edit │ Run Breakpoints Options Window ├──────┴─────────────┐ │ Assembler Shift+A │██ ──── перейти в режим ассемблера │ Dump Shift+D │██ ──── перейти в окно данных │ Registers Shift+R │██ ──── перейти в окно регистров │ Flags Shift+F │██ ──── перейти в окно флагов └────────────────────┘██ ██████████████████████ ┌─────┐ File Edit │ Run │ Breakpoints Options Window ├─────┴──────────────────┐ │ Run Ctrl+F9 │██ ──── запустить программу │ Go to cursor F4 │██ ──── выполнить до курсора │ Trace into F7 │██ ──── шаг с заходом в процедуры │ Step over F8 │██ ──── шаг без захода в процедуры │ Animate... │██ ──── [не реализовано] ├────────────────────────┤██ │ Arguments... │██ ──── командная строка программы │ Program reset Ctrl+F2 │██ ──── повторная загрузка программы └────────────────────────┘██ ██████████████████████████ ┌─────────────┐ File Edit Run │ Breakpoints │ Options Window ├─────────────┴─────┐ │ Set/Clear F2 │██ ──── установка/снятие контр. точки │ Activate Alt+F2 │██ ──── [не реализовано] │ Edit... │██ ──── [не реализовано] ├───────────────────┤██ │ Enable all │██ ──── разрешить все контр. точки │ Disable all │██ ──── запретить все контр. точки │ Delete all │██ ──── удалить все контр. точки └───────────────────┘██ █████████████████████ ┌─────────┐ File Edit Run Breakpoints │ Options │ Window ├─────────┴───────────────┐ выбор режима дисассемблера ──── │ CPU for disassembler  │██ выбор режима работы с экраном ─ │ Screen swapping  │██ [не реализовано] ────────────── │ Configuration... │██ └─────────────────────────┘██ ███████████████████████████ ┌────────┐ File Edit Run Breakpoints Options │ Window │ ├────────┴───────────────┐ перерисовка экрана отладчика ──── │ Refresh display F5 │██ отообразить экран программы ───── │ User screen Alt+F5 │██ └────────────────────────┘██ ██████████████████████████ Рис. 1.1 ──────────────────────────────────────────────────────────────────────── 1.3. Использование клавиатуры. ──────────────────────────────────────────────────────────────────────── Для выполнения большинства действий быстрее и удобнее использовать специальные комбинации клавиш. Список всех комбинаций и их назначения приводится в разделе 3.2, а детальное описание - в главах этого Описания. Некоторые действия могут быть выполнены только при помощи таких комбинаций, а некоторые редко выполняемые действия - только при помощи основного меню (например, некоторые настройки). ──────────────────────────────────────────────────────────────────────── 1.4. Окна диалога. ──────────────────────────────────────────────────────────────────────── В отладчике используются окна диалога, которые содержат обычные для такого рода окон элементы: кнопки, строки ввода и т. д., которые мало отличаются по своему назначению и функционированию от аналогов в других приложениях. Для работы с этими элементами используются стандартные способы, но клавиатурные комбинации Alt+буква не поддерживаются. Также не работает режим замены в строках ввода. ──────────────────────────────────────────────────────────────────────── 1.5. Числовые константы и адреса. ──────────────────────────────────────────────────────────────────────── Везде в отладчике используются только положительные шестнадцатеричные константы. Использование десятичных и двоичных чисел не предусмотрено (пока?). При записи констант не нужно указывать каких-либо префиксов или постфиксов. Значение константы не может быть более FFFF (65535). Например, допустимыми константами будут 0, 10, 1245, C0DE, 00FF, а недопустимыми - 0xFFFF, 12h, 111111 и т. д. Адреса в окнах диалога задаются в виде "сегмент:смещение". Сегмент и смещение - не обязательные параметры и могут быть опущены. Значение смещения не нужно заключать в квадратные скобки. В качестве сегмента и смещения могут быть указаны простые арифметические выражения, использующие только операции "+" и "-". В этих выражениях допускается использовать числовые константы, значения определенных 16-битных регистров (ax, bx, cx, dx, si, di, bp, sp, ip, fl) и значения сегментных регистров (cs, ds, es, ss, fs, gs). При использовании имен регистров в вычислении адреса используются значения, которые в них находятся. Примеры корректных адресов: cs:100, FFFF:0, ds:417, es:di+100, ds:si-1, es:di+bx-5, ax. Адресные выражения, которые используются в ассемблерных инструкциях (окно Search, окно Fill Block, окно код/ассемблер), могут содержать только числовые константы, т. к. использование регистров транслируется в инструкции. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 2. РАБОТА С ОТЛАДЧИКОМ. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ──────────────────────────────────────────────────────────────────────── 2.1. Запуск отладчика. ──────────────────────────────────────────────────────────────────────── 2.1.1. Требования к конфигурации компьютера. Отладчик выполняется на любом компьютере семейства x86 под управлением MS-DOS версии 3.3 и выше (и совместимых с ними). Для работы требуется (крайне желателен) цветной монитор и карта EGA, VGA или новее. Наверное, можно использовать CGA, но при работе с таким адаптером будет возникать эффект "снега". Манипулятор мышь в работе не поможет. Отладчик требует около 30KB свободного дискового пространства и в два раза больше на документацию. При работе отладчик занимает около 40КВ оперативной памяти. 2.1.2. Командная строка. В общем виде командная строка запуска отладчика имеет вид: insight [options] [progname [progparams]] options - параметры для отладчика; progname - имя отлаживаемой программы; progparams - параметры командной строки отлаживаемой программы. В качестве параметров отладчика могут быть использованы следующие: Параметр │ Назначение ═════════════╪══════════════════════════════════════════════════ /? │ вывести краткую подсказку по командной строке /h │ --///-- /r │ загрузить отладчик в память резидентно /u │ выгрузить отладчик, загруженный резидентно Табл. 2.1 Если отладчик запущен без ключа "/r", то его можно оставить в памяти резидентно, используя пункт меню File|Resident. ──────────────────────────────────────────────────────────────────────── 2.2. Настройки отладчика. ──────────────────────────────────────────────────────────────────────── 2.2.1. Режим работы дизассемблера. Дизассемблер отладчика может дизассемблировать инструкции процессора i486. В некоторых случаях нужно отображать команды только определенного процессора, например, 8086. Для изменения режима работы дизассемблера служит меню Options|CPU for disassembler. ┌─────────┐ │ Options │ ├─────────┴───────────────┐ │ CPU for disassembler  │██ │ Screen swapp┌─────────────┐ │ Configuratio│ 8086/8088 │██ ─── работа в режиме 8086 └─────────────│ 80286 │██ ─── работа в режиме 80286 ████████████│ 80386 │██ ─── работа в режиме 80386 │ 80486 │██ ─── работа в режиме i486 ├─────────────┤██ │ Auto detect │██ ─── автоматическая установка нужного └─────────────┘██ режима работы дизассемблера ███████████████ Рис. 2.1 В этом меню (Рис. 2.1) можно выбрать нужный тип процессора, или пункт Options|CPU for disassembler|Auto detect. В последнем случае режим работы дизассемблера устанавливается в зависимости от типа процессора компьютера, на котором запущен отладчик. Для процессоров i486 и старше устанавливается режим 486-го процессора. При запуске отладчика режим работы дизассемблера определяется автоматически. 2.2.2. Режим работы с экраном. Отладчик работает с экраном напрямую, предотвращения эффекта "снега" на мониторах CGA не производится. Экран отлаживаемой программы (4000 байт) сохраняется в буфере - подразумевается работа отладчика в текстовом режиме 80*25. При работе в текстовых режимах с большим количеством строк окно отладчика будет располагаться в верхней части экрана, нижняя часть будет содержать информацию программы ("мусор"). При работе с приложениями, которые используют графические режимы работы, используется переключение видеорежима без очистки видеопамяти. Обычно при этом частично портится верхняя часть экрана программы. При совместимости видеокарты с VGA кроме самого экрана сохраняется используемая цветовая палитра, которая восстанавливается при переключении экрана на экран приложения. При отладке программы можно задать способ, каким отладчик должен работать с экраном отлаживаемой программы. Это можно сделать при помощи меню Options|Screen swapping (Рис. 2.2). ┌─────────┐ │ Options │ ├─────────┴───────────────┐ │ CPU for disassembler  │██ │ Screen swapping  │██ │ Configuration.┌──────────┐█ └───────────────│ None │██ ─── не осуществлять переключения ██████████████│ Smart │██ ─── переключение на определенных инструкциях │ Always │██ ─── переключение при каждом шаге └──────────┘██ ████████████ Рис. 2.2 В режиме Always отладчик переключается на экран отлаживаемой программы при любом запуске программы на выполнение (пошаговое выполнение, до курсора и т. д.). В режиме None на экране отображается только информация отладчика, при запуске программы переключения на ее экран не происходит. Поэтому в этом режиме не происходит "моргания" экрана при пошаговом выполнении. В режиме Smart экраны переключаются только в определенных случаях: при запуске программы, при выполнении до курсора и при пошаговом выполнении инструкций, которые могут вызвать изменение изображения экрана программы. В любой момент отладки можно посмотреть экран отлаживаемой программы, выбрав пункт меню Window|User screen или нажав Alt+F5. Если выполнение программы привело к порче изображения экрана отладчика, то перерисовать экран отладчика можно при помощи меню Window|Refresh display или нажав F5. ──────────────────────────────────────────────────────────────────────── 2.3. Окно кода/ассемблера. ──────────────────────────────────────────────────────────────────────── 2.3.1. Окно кода. Окно кода (Рис. 2.3) является основным рабочим окном отладчика. В нем отображается дизассемблированные в соответствии с выбранным процессором (2.2.1) инструкции, контрольные точки, производится редактирование команд. ═════ AuthenticAMD 486 ════ Debugger N82538874.S04a ══╕ 014A F8 clc │ 014B C3 ret │ 014C 83C303 add bx,0003 │ 014F E2F2 loop 0143  │ 0151 F9 stc │ 0152 C3 ret ├ 0153 E8A31C call 1DF9 │ 0156 3445 xor al,45 │ 01588B1E9078 mov bx,[7890] 5├ 015C 38876967 cmp [bx+6769],al │ 0160 7408 jz 016A  │ 0162 33DB xor bx,bx │ 0164 38066967 cmp [6769],al │ 0168 75E7 jnz 0151  │ 016A 43 inc bx │ 016B 891E9078 mov [7890],bx │ 016F 80FB05 cmp bl,05 │ ───── 15CB:0158 ──── DS:7890 = 2601 ───────── DS:SI ──┴ Рис. 2.3 В верхней части окна кода отображается тип процессора, название отладчика и номер его версии. Для процессоров, которые не поддерживают команду CPUID, выводится номер модели процессора, для остальных - строка, выдаваемая этой инструкцией, и условный номер модели. Например, для Intel Pentium будет выдано GenuineIntel 586. В нижней части окна показывается адрес, на котором находится курсор окна кода, а для команд, обращающихся к памяти - содержимое используемых ячеек. Также может отображаться состояние режима слежения за данными (2.9.2), а цифрами в правой колонке - запомненные позиции окна кода (2.9.3). 2.3.2. Дизассемблер. Дизассемблер позволяет просматривать инструкции программы в одном из четырех режимов: 8086/8088, 80286, 80386 и i486. Режим задается при помощи меню Options|CPU for disassembler (2.2.1). Для более наглядного отображения инструкций используется простое цветовое выделение - адреса инструкций, коды команд, мнемоника команд и числовые константы выделяются различными цветами. Также специально выделяются инструкции, на которых установлены контрольные точки (2.8.3) и их активность. Для команд переходов (jmp и call) дополнительно указывается (в виде стрелки) направление передачи управления, причем для команд условных переходов цветом этой стрелки показывается, будет ли передано управление в соответствии с этой командой (если будет, то стрелки имеет более яркий цвет). Для удобства в командах перехода на следующую команду или на саму себя указывается не непосредственно адрес назначения, а смещение, относительно данной команды ($), например, jmp $+2. Сегментные префиксы, которые используются по умолчанию в командах, опускаются. Комбинации Ctrl+ и Ctrl+ изменяют начальный адрес дизассемблирования на -1 и +1 соответственно. Эту возможность следует использовать, если дизассемблер неправильно определил начало команды. 2.3.3. Ассемблер. Ассемблер позволяет работать только с инструкциями процессоров 8086/8088 и двумя инструкциями данных - db и dw. Для перехода в режим ассемблера используется пункт Edit|Assembler основного меню, пункт Assembler локального меню окна кода или комбинация Shift+A, а выхода - клавиши Enter или Esc. Если выход производится при помощи Esc, то та инструкция, которая изменялась последней, восстанавливается. В ассемблере не нужно вводить префиксы, используемые по умолчанию. Можно использовать при задании адресов переходов символ $. Следует учесть, что ассемблер работает с инструкциями 8086/8088, а дизассемблер может дизассемблировать команды и 80486. Поэтому если вы находитесь в режиме ассемблера и нажимаете Enter на инструкции 80286 (или старше), то ассемблер попытается ее обработать, даже если она не редактировалась, а была получена дизассемблированием. В результате будет выдано сообщение об ошибке. ──────────────────────────────────────────────────────────────────────── 2.4. Окно данных. ──────────────────────────────────────────────────────────────────────── Окно данных (Рис. 2.4) расположено под окном кода и показывает данные, находящиеся по выбранному адресу в двух видах - в виде шестнадцатеричных значений (слева) и в виде символов (справа). Находясь в окне данных можно редактировать содержимое памяти в любом из этих двух видов. Переход от одного вида к другому осуществляется клавишей Tab. Комбинации Ctrl+ и Ctrl+ меняют адрес начала отображения данных на -1 и +1. В окне данных положение текущего байта показывается цветовым выде- лением в обоих его половинах, а мигающий курсор указывает ту полови- ну, в котрой непосредственно осуществляется редактирование. ───── 15CB:6DF8 ──── DS:7872 = 5500 ──────────────────┴───────────────────────── B C D E F 0 1 2 3 4 5 6 7 8 9 A 15CB:713B 4D 65 6D 6F 72 79 20 61 6C 6C 6F 63 61 74 69 6F Memory allocatio 15CB:714B 6E 20 65 72 72 6F 72 24 43 61 6E 27 74 20 72 65 n error$Can't re 15CB:715B 6C 65 61 73 65 20 64 65 62 75 67 67 65 72 20 6D lease debugger m 15CB:716B 65 6D 6F 72 79 24 44 65 62 75 67 67 65 72 20 6E emory$Debugger n 15CB:717B 6F 74 20 66 6F 75 6E 64 20 69 6E 20 6D 65 6D 6F ot found in memo Рис. 2.4 Изменения, сделанные в окне данных носят необратимый характер и не могут быть отменены. ──────────────────────────────────────────────────────────────────────── 2.5. Окно регистров. ──────────────────────────────────────────────────────────────────────── Окно регистров (Рис. 2.5) может работать в двух режимах - 16- битном (a) и 32-битном (b). Второй режим возможен только на компьютерах с процессором 80386 и старше, иначе его невозможно включить. Режим можно переключить при помощи пункта 16/32-bit regs локального меню окна кода, такого же пункта локального меню окна регистров или комбинацией Ctrl+R в любом из этих окон. При работе в режиме 32-битных регистров окно имеет больший размер, оно увеличивается за счет уменьшения окна стека. ╕AX=0000 SI=0100 CS=15CB ╕EAX=0000:0000 CS=15CB │BX=0000 DI=FFFC DS=15CB │EBX=0000:0000 DS=15CB │CX=00FF BP=091C ES=15CB │ECX=0000:00FF ES=15CB │DX=15CB SP=FFFC SS=15CB │EDX=0000:15CB SS=15CB │ │ESI=0000:0100 FS=0000 │IP=0100 Flags=7202 │EDI=0000:FFFC GS=0000 ├───────────────────────── │ │EBP=0000:091C IP=0100 │ESP=0000:FFFC Flags=7202 ├───────────────────────── a. b. Рис. 2.5 Находясь в окне регистров можно изменять их значения, вводя непосредственные значения или используя специальные команды. Увеличить содержимое регистра на 1 можно, выбрав пункт Increment локального меню или нажав Ctrl+I, а уменьшить значение на 1 - при помощи пункта Decrement или комбинации Ctrl+D. Регистр обнуляется командой Zero или комбинацией Ctrl+Z. Те регистры, значение которых изменено, отображаются другим, ярким цветом. Первоначальное значение регистра может быть восстановлено после всех изменений. Для восстановления значения одного из регистров нужно установить курсор на этот регистр и выбрать пункт Restore локального меню окна регистров или нажать Ctrl+O. Таким образом, можно восстановить значения любого из регистров. Для восстановления значений всех регистров используется пункт Restore all меню окна регистр или окна кода или клавиатурная комбинация Ctrl+A в тех же окнах. При этом восстанавливаются значения во всех регистрах, кроме пары CS:IP и регистра флагов. Для восстановления значений в регистрах CS и IP можно использовать команду Restore или специальную команду Restore CS:IP (комбинация Ctrl+C), которую можно вызвать в окне кода или регистров. Для восстановления значения флагов также есть специальный пункт меню Restore flags, которому соответствует комбинация Ctrl+T. После выполнения шага программы или при прерывании выполнения по контрольной точке, в окне регистров тем же ярким цветом выделяются регистры, значение которых изменилось в результате выполнения программы. Значения регистров можно восстановить (заменить предыдущим значением), если выбрать нужный пункт меню окна кода или нажать соответствующую комбинацию клавиш. После перехода в окно регистров или флагов такое восстановление станет невозможным. ──────────────────────────────────────────────────────────────────────── 2.6. Окно флагов. ──────────────────────────────────────────────────────────────────────── Окно флагов (Рис. 2.6) меняет свое расположение в зависимости от режима работы окна регистров - при отображении 32-битных регистров окно флагов расположено на несколько строк ниже. Окно флагов позволяет изменять значения отдельных флагов. Установленному флагу соответствует значение 1, а сброшенному - 0. Можно непосредственно задать значение флага или переключить его на противоположное при помощи команды Toggle меню или нажатия на пробел. Восстановить значения всех флагов можно выбрав команду Restore flags или используя Ctrl+T. ├───────────────────────── │ OF DF IF SF ZF AF PF CF │ 0 0 1 0 0 0 0 0 ├───────────────────────── Рис. 2.6 ──────────────────────────────────────────────────────────────────────── 2.7. Окно стека. ──────────────────────────────────────────────────────────────────────── Окно стека (Рис. 2.7) не может быть активизировано. Оно показывает только несколько значений, которые находятся на вершине стека, причем при отображении 32-битных регистров это окно становится меньше на 3 строки, чем при показе 16-битных регистров. ├───────────────────────── │ Stack: SS:000A 088C │ SS:0008 F01D │ SS:0006 FEF0 │ SS:0004 9A00 │ SS:0002 A000 │ SS:0000 20CD │ SS:FFFE 0000 │ SS:SP SS:FFFC 0000 ┴───────────────────────── Рис. 2.7 ──────────────────────────────────────────────────────────────────────── 2.8. Отладка программы. ──────────────────────────────────────────────────────────────────────── 2.8.1. Загрузка программы. Загрузить программу в отладчик можно, указав ее имя (с расширением!) и параметры в командной строке (2.1) или используя пункт File|Load■основного меню (клавиша F3). В последнем случае файл программы можно выбрать в простом диалоге Load a File. В этом диалоге можно или выбрать файл из списка файлов текущего каталога, или указать путь к нужному файлу в строке ввода Name. При загрузке программы при помощи окна диалога Load a File, параметры программы должны быть указаны отдельно, в диалоге Arguments, который вызывается командой Run|Arguments■Этот же диалог используется, если нужно изменить командную строку программы. Если нужно повторно загрузить в отладчик программу, которая только что отлаживалась или отлаживается, то следует выбрать пункт меню Run|Program reset или нажать Ctrl+F2. При этом прекращается отладка программы, программа загружается повторно, контрольные точки сохраняются и строка параметров. Другой способ прервать выполнение программы - использовать меню File|New. При этом отладка программы прекращается, заново она не загружается, удаляются все контрольные точки, очищается строка параметров. 2.8.2. Выполнение программы. Для запуска программы можно выбрать меню Run|Run или нажать Ctrl+F9. После этого программа выполняется до завершения или до контрольной точки (команды int 3). Для пошагового выполнения следует использовать команды Run|Trace into (F7) и Run|Step over (F8). Если используется вторая команда, то инструкции call, int, loop, работа со строками не трассируются как при использовании первой команды. Но если, например, внутри процедуры находится контрольная точка, то останов на ней произойдет. Команда Run|Go to cursor (F4) позволяет выполнить участок программы до инструкции, на которой находится курсор в окне кода. Если нужно задать новое значение пары CS:IP, то это можно сделать двумя способами - задать значения регистров в окне регистров или в окне кода перейти на нужную инструкцию и нажать Ctrl+N (пункт New CS:IP в локальном меню) и эта инструкция станет новой текущей инструкцией. 2.8.3. Контрольные точки. Отладчик позволяет задать 10 контрольных точек (если контрольных точек будет не хватать, то сообщите - перекомпилируем). Контрольная точка устанавливается нажатием F2 или выбором меню Breakpoints|Set/Clear при выбранной нужной инструкции. Если на данной инструкции уже стояла контрольная точка, то она будет снята. Контрольные точки выделяются цветом в окне кода. Контрольную точку можно временно запретить (контрольная точка не удаляется, но выполнение программы прерываться на ней не будет). Для этого курсор подводится к нужной контрольной точке и нажимается Alt+F2 (Breakpoints|Activity). Повторное нажатие разрешит данную контрольную точку. Состояние точки также указывается цветом. Для удобства можно использовать пункты меню Breakspoints|Delete all для удаления всех контрольных точек, Breakpoints|Disable all - для запрещения всех контрольных точек и Breakpoints|Enable all - для разрешения всех контрольных точек. ──────────────────────────────────────────────────────────────────────── 2.9. Навигация в коде и данных. ──────────────────────────────────────────────────────────────────────── 2.9.1. Переход к нужному адресу. Для кода и для данных используются различные команды перехода к нужному адресу, причем одни команды вызываются из окна кода, другие - из окна данных, а третью - как из окна кода, так и из окна данных. Если нужно в окне кода отобразить тот адрес, на который ссылается команда передачи управления, то нужно или выбрать пункт Code position|Follow локального меню окна кода, или нажать Ctrl+F. Непосредственно задать адрес можно в диалоге Goto, вызываемом пунктом Code position|Address■ (Ctrl+G). Для возврата к текущей инструкции - Code position|Origin (Ctrl+O или Ctrl+Enter). Все переходы в окне кода запоминаются в специальном стеке, поэтому можно вернуться к предыдущей позиции при помощи пункта Code position|Previous (Ctrl+P). Этот стек использует область памяти отладчика, которая также используется и для других целей. Из-за этого может возникнуть ситуация, когда часть данных стека будет затерта. В этом случае отладчик покажет предупреждение и очистит стек. При активном окне данных можно позиционировать окно кода на адрес, который определяет ячейка памяти, где находится курсор. В этом случае или два подряд идущих байта трактуются как новое смещение для дизассемблера (near-указатель), новый сегмент для дизассемблера (far-указатель со смещением 0) или четыре байта - как смещение и сегмент нового адреса (far-указатель). Для таких переходов нужно вызвать подменю Dump follow из локального меню окна данных, или непосредственно нажатием Ctrl+F. В этом подменю пункт Near code позволяет задать новое смещение для окна кода, Far code - новое смещение и сегмент, Code segment - новый сегмент и смещение 0. Непосредственно новый адрес для показа памяти в окне данных можно задать, вызвав диалог Goto из меню Dump position|Address■ (Ctrl+D). Это меню есть в локальных меню обоих окон. Если инструкция, на которой расположен курсор окна кода, ссылается на ячейку памяти, то адрес этой ячейки может быть использован как начальный для отображения в окне данных - пункт Dump position|Reference (Alt+=). Дополнительные пункты подменю Dump position и соответствующие им комбинации клавиш позволяют в окне данных отобразить память, на которую ссылаются определенные пары регистров. Эти пункты и комбинации приведены в Табл. 2.2. Пункт меню │ Клавиши │ Назначение ══════════════╪═══════════╪════════════════════════════ Dump DS:SI │ Alt+D │ установить окно на DS:SI Dump ES:DI │ Alt+E │ установить окно на ES:DI Dump SS:BP │ Alt+S │ установить окно на SS:BP Dump CS:IP │ Alt+C │ установить окно на CS:IP Dump ES:BX │ Alt+B │ установить окно на ES:BX Dump ES:SI │ Alt+I │ установить окно на ES:SI Dump DS:DX │ Alt+F │ установить окно на DS:DX Dump DS:DI │ Alt+J │ установить окно на DS:DI Dump DX:AX │ Alt+A │ установить окно на DX:AX Dump code │ Alt+L │ установить окно на адрес │ │ текущей позиции курсора │ │ окна кода Табл. 2.2 Аналогично позиционированию окна кода, окно данных можно устанавливать на адрес, который определяется значением в памяти, - для этого выбирается пункт меню Near data, Far data или Data segment из подменю Dump follow, которое можно также вызвать по Ctrl+F. 2.9.2. Слежение за данными (DataWatch). Если нужно отслеживать память, на которую ссылается изменяющаяся пара регистров, то можно воспользоваться функцией слежения за данными. Когда включен этот режим окно, данных автоматически позиционируется в соответствии с выбранной парой регистров. Например, при проверке работы со строкой может потребоваться просматривать тот байт, на который указывает пара DS:SI. Слежение за данными позволяет не позиционировать "вручную" окно данных на нужный адрес после каждого шага, а сделать это автоматически. Чтобы включить этот режим вначале следует установить окно данных при помощи одной из комбинаций из Табл. 2.2, а затем нажать Ctrl+W или выбрать пункт Data watch в локальном меню окна кода. После этого окно данных будет обновляться автоматически. Повторное нажатие Ctrl+W выключит этот режим. 2.9.3. Запоминание позиции (CodeMarks и DataMarks). Для удобства работы текущую позицию окна кода или данных можно запоминать. Всего можно запомнить до 10 мест. Работа с метками возможна только в окне кода. Чтобы запомнить позицию в окне кода нужно перейти в этом окне на нужный адрес и установить курсор на нужную строку. Затем нажать Alt и цифру - номер отметки. Справа от этой строки будет отображаться номер отметки для перехода к данному месту. Перейти к отметке, нажав соответствующую цифру. Чтобы перенести отметку ее нужно просто поставить в новом месте, а чтобы стереть - нажать Shift и соответствующую цифру. Запоминание позиции окна данных осуществляется аналогично - нужно перейти на нужный адрес и нажать Shift+Alt+цифра. Отметки в окне данных никак не отображаются, переход к метке и ее удаление производятся аналогично. ──────────────────────────────────────────────────────────────────────── 2.10. Работа с данными. ──────────────────────────────────────────────────────────────────────── 2.10.1. Строка поиска/заполнения. В диалогах поиска Search (2.10.2) и заполнения области памяти Fill Block (2.10.4) необходимо указывать данные, поиск которых производится или которые ищутся. В качестве таких данных могут быть указаны шестнадцатеричные значения байтов, последовательности символов (строки) и инструкции. После каждой инструкции ассемблера обязательно должен следовать символ "точка с запятой", байты и строки должны отделяться друг от друга и от инструкций либо пробелом, либо точкой с запятой. Строки заключаются с двух сторон в кавычки или апострофы. Если в строке имеется апостроф, то строку нужно заключать в кавычки, а если кавычки - в апострофы. В случае, когда встречаются оба символа нужно разбить строку не несколько. Например, следующие строки допустимы: 90 nop; nop 1 2; 3 "abc" '"' cmp ax,1; 90 Если строка содержит инструкции ассемблера, использующие относительную адресацию (например, call near или jmp near), то в качестве базового адреса используется текущее значение CS:IP. 2.10.2. Поиск данных (Data search). Окно диалога поиска данных Search можно вызвать из окна кода при помощи комбинации Ctrl+S или пункта Search bytes меню этого же окна. Если нужно найти следующий экземпляр тех же данных, то можно использовать пункт Serach again (Ctrl+L) локального меню. Поиск определяется диалогом Search. В строке ввода Search for следует указать данные, которые нужно искать (2.10.1), в строке Address - начальный адрес, откуда начинать поиск, среди флажков Options - выбрать нужные. Они имеют следующий смысл: Ignore case - если установлен, то игнорировать различия в регистре символов; Backward - если не установлен, то данные ищутся от указанного адреса к концу памяти, а если установлен - к началу (поиск в обратном направлении); Exclude HMA - если этот флажок не установлен, то данные ищутся и в области HMA, выше 1МВ (если A20 не разрешена, то произойдет переход к началу памяти), если установлен, то данные ищутся только в пределах 1МВ; при поиске в обратном направлении этот флажок не играет роли; Result in code - если этот флажок не установлен, то при нахождении данных окно данных будет устанавливаться на адрес их начала, если установлен, то на их начало будет установлено окно кода. 2.10.3. Копирование данных. Отладчик позволяет копировать участки памяти, заполнять определенными байтами, записывать в файл и считывать из файла области памяти. Для работы с блоками (областями памяти) предназначено специальное локальное меню (Рис. 2.9), которое может быть вызвано нажатием Ctrl+B при активном окне кода или данных или из локального меню окна данных. ┌─────────────┐ │ Copy... │██ ────── копирование блоков данных │ Fill... │██ ────── заполнение области памяти выбранными значениями │ Write... │██ ────── запись участка памяти в файл │ Read... │██ ────── чтение файла в область памяти └─────────────┘██ ███████████████ Рис. 2.9 Копирование данных происходит при помощи окна Copy Block, в котором указывается, откуда копируются данные (From), куда они копируются (To) и количество копируемых байт (Count). Копирование производится обычной 16-битной инструкцией rep movsb, со всеми вытекающими отсюда последствиями: копирование не более 64КВ данных, в определенных случаях может произойти циклический переход (например, смещение + счетчик > 10000h). Перед копированием происходит выравнивание адреса. 2.10.4. Заполнение области памяти. Заполнение области памяти производится аналогично копированию, используется диалог Fill Block. Начальный адрес задается в поле From, количество повторений - Count, значения, которые должны быть записаны в память - Fill with (значения записываются по правилам, которые указаны в 2.10.1). Заполнено может быть также не более 64КВ. Байты, определяемые строкой Fill with, записываются указанное в Count количество раз. 2.10.5. Запись области памяти в файл. Нужный блок можно записать в файл на диске. На размер блока накладываются прежние ограничения. В окне диалога Write Block указывается имя файла (File name), адрес начала блока (From) и размер блока в байтах (Count). Если файл с таким именем уже существует, то будет предложено перезаписать существующий файл или добавить блок к нему. 2.10.6. Чтение области памяти из файла. Чтение данных файла в память производится аналогичным записи способом, используя диалог Read Block. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 3. ПРИЛОЖЕНИЯ. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ──────────────────────────────────────────────────────────────────────── 3.1. Описание системы меню. ──────────────────────────────────────────────────────────────────────── 3.1.1. Основное меню. File ~~~~ Load Включить/выключить контрольную точку (F3, раздел 2.8.1) New Включить/выключить контрольную точку (раздел 2.8.1) About Показать окно с информацией о программе и авторах Resident Выйти из отладчика, оставив его резидентным в памяти (раздел 2.1.2) Exit Выйти из отладчика, если он не находится резидентно в памяти (Alt+X) Edit ~~~~ Assembler Перейти в режим ассемблирования (редактирования) кода (Shift+A, раздел 2.3.3) Dump Перейти в окно данных (Shift+D, раздел 2.4) Registers Перейти в окно регистров (Shift+R, раздел 2.5) Flags Перейти в окно флагов (Shift+F, раздел 2.6) Run ~~~ Run Запустить программу на выполнение (Ctrl+F9, раздел 2.8.2) Go to cursor Выполнить до текущего положения курсора (F4, раздел 2.8.2) Trace into Выполнить инструкцию с заходом в процедуры (F7, раздел 2.8.2) Step over Выполнить инструкцию без захода в процедуры (F8, раздел 2.8.2) Animate Не используется Arguments Отредактировать командную строку отлаживаемой программы (раздел 2.8.1) Program reset Прервать отладку, повторно загрузить программу (Ctrl+F2, раздел 2.8.1) Breakpoints ~~~~~~~~~~~ Set/Clear Включить/выключить контрольную точку (F2, раздел 2.8.3) Activity Разрешить/запретить контрольную точку (Alt+F2, раздел 2.8.3) Edit Не используется Delete all Удалить все контрольные точки (раздел 2.8.3) Enable all Разрешить все контрольные точки (раздел 2.8.3) Disable all Запретить все контрольные точки (раздел 2.8.3) Options ~~~~~~~ CPU for disassembler ~~~~~~~~~~~~~~~~~~~~ 8086/8088 Режим дизассемблирования процессоров 8086/8088 (раздел 2.2.1) 80286 Режим дизассемблирования процессора 80286 (раздел 2.2.1) 80386 Режим дизассемблирования процессора 80386 (раздел 2.2.1) 80486 Режим дизассемблирования процессора 80486 (раздел 2.2.1) Auto detect Автоматически определить режим дизассемблирования в соответствии с процессором (раздел 2.2.1) Screen swapping ~~~~~~~~~~~~~~~ None Не переключаться на экран программы при ее отладке (раздел 2.2.2) Smart Переключаться на экран программы при ее отладке только на определенных инструкциях (раздел 2.2.2) Always Переключаться на экран программы при ее отладке на любой инструкции (раздел 2.2.2) Configuration Не используется Window ~~~~~~ Refresh display Перерисовать экран отладчика (F5, раздел 2.2.2) User screen Показать экран программы (Alt+F5, раздел 2.2.2) 3.1.2. Меню окна кода. Assembler Перейти в режим ассемблирования (редактирования) кода (Shift+A, раздел 2.3.3) New CS:IP Установить CS:IP на адрес инструкции, на которой находится курсор (Ctrl+N, раздел 2.8.2) 16/32-bit regs Переключение 16/32-битного отображения регистров (Ctrl+R, раздел 2.5) Data watch Включить/выключить режим слежения за данными (Ctrl+W, раздел 2.9.2) Dump position ~~~~~~~~~~~~~ Address Установить адрес отображения окна данных (Ctrl+D, раздел 2.9.1) Reference Установить отобразить окно данных, начиная с адреса, на который ссылается команда, выделенная курсором (Alt+=, раздел 2.9.1) Dump DS:SI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:SI (Alt+D, раздел 2.9.1) Dump ES:DI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:DI (Alt+E, раздел 2.9.1) Dump SS:BP Установить отобразить окно данных, начиная с адреса, определяемого значением регистров SS:BP (Atl+S, раздел 2.9.1) Dump CS:IP Установить отобразить окно данных, начиная с адреса, определяемого значением регистров CS:IP (Alt+C, раздел 2.9.1) Dump ES:BX Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:BX (Alt+B, раздел 2.9.1) Dump ES:SI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:SI (Alt+I, раздел 2.9.1) Dump DS:DX Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DX (Alt+F, раздел 2.9.1) Dump DS:DI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DI (Alt+J, раздел 2.9.1) Dump DX:AX Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DX:AX (Alt+A, раздел 2.9.1) Dump code Установить отобразить окно данных, начиная с адреса инструкции, на которой находится курсор (Alt+L, раздел 2.9.1) Code position ~~~~~~~~~~~~~ Address Установить адрес отображения окна кода (Ctrl+G, раздел 2.9.1) Origin Отобразить инструкции в окне кода, начиная с адреса CS:IP (Ctrl+O или Ctrl+Enter, раздел 2.9.1) Follow Перейти на адрес, на который ссылается инструкция (Ctrl+F, раздел 2.9.1) Previous Вернуться к предыдущей позиции в окне кода (Ctrl+P, раздел 2.9.1) Restore CS:IP Восстановить значение пары CS:IP (Ctrl+C, раздел 2.5) Restore regs Восстановить значения регистров, кроме CS, IP и флагов (Ctrl+A, раздел 2.5) Restore flags Восстановить значение регистра флагов (Ctrl+T, разделы 2.5 и 2.6) Search bytes Поиск данных и/или инструкций (Ctrl+S, раздел 2.10.2) Search again Найти следующую последовательность байт (Ctrl+L, раздел 2.10.2) 3.1.3. Меню окна данных. Dump position ~~~~~~~~~~~~~ Address Установить адрес отображения окна данных (Ctrl+D, раздел 2.9.1) Reference Установить отобразить окно данных, начиная с адреса, на который ссылается команда, выделенная курсором (Alt+=, раздел 2.9.1) Dump DS:SI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:SI (Alt+D, раздел 2.9.1) Dump ES:DI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:DI (Alt+E, раздел 2.9.1) Dump SS:BP Установить отобразить окно данных, начиная с адреса, определяемого значением регистров SS:BP (Atl+S, раздел 2.9.1) Dump CS:IP Установить отобразить окно данных, начиная с адреса, определяемого значением регистров CS:IP (Alt+C, раздел 2.9.1) Dump ES:BX Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:BX (Alt+B, раздел 2.9.1) Dump ES:SI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:SI (Alt+I, раздел 2.9.1) Dump DS:DX Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DX (Alt+F, раздел 2.9.1) Dump DS:DI Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DI (Alt+J, раздел 2.9.1) Dump DX:AX Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DX:AX (Alt+A, раздел 2.9.1) Dump code Установить отобразить окно данных, начиная с адреса инструкции, на которой находится курсор (Alt+L, раздел 2.9.1) Dump follow ~~~~~~~~~~~ Near data Отобразить окно данных, начиная со смещения, на котором находится курсор этого окна (раздел 2.9.1) Far data Отобразить окно данных, начиная с сегмента и смещения, на котором находится курсор этого окна (раздел 2.9.1) Data segment Отобразить окно данных, начиная с сегмента, на котором находится курсор этого окна, и смещения 0 (раздел 2.9.1) Near code Отобразить окно кода, начиная со смещения, на котором находится курсор окна данных (раздел 2.9.1) Far code Отобразить окно кода, начиная с сегмента и смещения, на котором находится курсор окна данных (раздел 2.9.1) Code segment Отобразить окно кода, начиная с сегмента, на котором находится курсор окна данных, и смещения 0 (раздел 2.9.1) Block ~~~~~ Copy Копирование области памяти (раздел 2.10.3) Fill Заполнение области памяти байтами (раздел 2.10.4) Write Запись области памяти в файл (раздел 2.10.5) Read Чтение блока из файла (раздел 2.10.6) Search bytes Поиск данных и/или инструкций (Ctrl+S, раздел 2.10.2) Serach again Найти следующую последовательность байт (Ctrl+L, раздел 2.10.2) 3.1.4. Меню окна регистров. Increment Увеличить значение регистра на 1 (Ctrl+I, раздел 2.5) Decrement Уменьшить значение регистра на 1 (Ctrl+D, раздел 2.5) Zero Обнулить регистр (Ctrl+Z, раздел 2.5) Restore Восстановить значение регистра (Ctrl+O, раздел 2.5) Restore all Восстановить значения регистров, кроме CS, IP и флагов (Ctrl+A, раздел 2.5) Restore CS:IP Восстановить значение пары CS:IP (Ctrl+C, раздел 2.5) Restore flags Восстановить значение регистра флагов (Ctrl+T, разделы 2.5 и 2.6) 32-bit regs Переключение 16/32-битного отображения регистров (Ctrl+R, раздел 2.5) 3.1.5. Меню окна данных. Toggle Переключить значение флага (Space, раздел 2.6) Restore flags Восстановить значение регистра флагов (Ctrl+T, разделы 2.5 и 2.6) ──────────────────────────────────────────────────────────────────────── 3.2. Клавиатурные сокращения. ──────────────────────────────────────────────────────────────────────── 3.2.1. Окно кода. цифра (n) Переход к метке n (раздел 2.9). F2 Включить/выключить контрольную точку (Breakpoints|Set/Clear, раздел 2.8.3) F3 Загрузить новую программу в нерезидентный отладчик (File|Load■, раздел 2.8.1) F4 Выполнить до текущего положения курсора (Run|Go to cursor, раздел 2.8.2) F5 Перерисовать экран отладчика (Window|Refresh display, раздел 2.2.2) F7 Выполнить инструкцию с заходом в процедуры (Run|Trace into, раздел 2.8.2) F8 Выполнить инструкцию без захода в процедуры (Run|Step over, раздел 2.8.2) Shift+цифра (n) Удалить метку с номером n (раздел 2.9) Shift+A Перейти в режим ассемблирования (редактирования) кода (Edit|Assembler, раздел 2.3.3) Shift+D Перейти в окно данных (Edit|Dump, раздел 2.4) Shift+F Перейти в окно флагов (Edit|Flags, раздел 2.6) Shift+R Перейти в окно регистров (Edit|Registers, раздел 2.5) Ctrl+Enter Отобразить инструкции в окне кода, начиная с адреса CS:IP (Origin, раздел 2.9.1) Ctrl+A Восстановить значения регистров, кроме CS, IP и флагов (Restore regs, раздел 2.5) Ctrl+B Вызвать меню работы с блоками (областями) памяти (раздел 2.10) Ctrl+C Восстановить значение пары CS:IP (Restore CS:IP, раздел 2.5) Ctrl+D Установить адрес отображения окна данных (Dump position|Address■, раздел 2.9.1) Ctrl+F Перейти на адрес, на который ссылается инструкция (Code position|Follow, раздел 2.9.1) Ctrl+G Установить адрес отображения окна кода (Code position|Address■, раздел 2.9.1) Ctrl+L Найти следующую последовательность байт (Search again, раздел 2.10.2) Ctrl+N Установить CS:IP на адрес инструкции, на которой находится курсор (New CS:IP, раздел 2.8.2) Ctrl+O Отобразить инструкции в окне кода, начиная с адреса CS:IP (Origin, раздел 2.9.1) Ctrl+P Вернуться к предыдущей позиции в окне кода (Code position|Previous, раздел 2.9.1) Ctrl+R Переключение 16/32-битного отображения регистров (16/32-bit mode, раздел 2.5) Ctrl+S Поиск данных и/или инструкций (Search bytes■, раздел 2.10.2) Ctrl+T Восстановить значение регистра флагов (Restore flags, разделы 2.5 и 2.6) Ctrl+W Включить/выключить режим слежения за данными (Data watch, раздел 2.9.2) Ctrl+F2 Прервать отладку, повторно загрузить программу (Run|Program reset, раздел 2.8.1) Ctrl+F9 Запустить программу на выполнение (Run|Run, раздел 2.8.2) Alt+цифра (n) Запомнить позицию окна кода, присвоив ей метку n (раздел 2.9.3) Alt+= Установить отобразить окно данных, начиная с адреса, на который ссылается команда, выделенная курсором (Dump position|Reference, раздел 2.9.1) Alt+A Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DX:AX (Dump position|Dump DX:AX, раздел 2.9.1) Alt+B Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:BX (Dump position|Dump ES:BX, раздел 2.9.1) Alt+C Установить отобразить окно данных, начиная с адреса, определяемого значением регистров CS:IP (Dump position|Dump CS:IP, раздел 2.9.1) Alt+D Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:SI (Dump position|Dump DS:SI, раздел 2.9.1) Alt+E Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:DI (Dump position|Dump ES:DI, раздел 2.9.1) Alt+F Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DX (Dump position|Dump DS:DX, раздел 2.9.1) Alt+I Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:SI (Dump position|Dump ES:SI, раздел 2.9.1) Alt+J Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DI (Dump position|Dump DS:DI, раздел 2.9.1) Alt+L Установить отобразить окно данных, начиная с адреса инструкции, на которой находится курсор (Dump position|Dump code, раздел 2.9.1) Alt+S Установить отобразить окно данных, начиная с адреса, определяемого значением регистров SS:BP (Dump position|Dump SS:BP, раздел 2.9.1) Alt+X Выход из отладчика, если он не находится резидентно в памяти Alt+F2 Разрешить/запретить контрольную точку (Breakpoints|Activity, раздел 2.8.3) Alt+F5 Показать экран программы (Window|User screen, раздел 2.2.2) Alt+Shift+цифра (n) Запомнить позицию окна данных, присвоив ей метку n (раздел 2.9.3) 3.2.2. Окно данных. Ctrl+B Вызвать меню работы с блоками (областями) памяти (раздел 2.10) Ctrl+D Установить адрес отображения окна данных (Dump position|Address■, раздел 2.9.1) Ctrl+F Перейти на адрес, на который ссылается инструкция (раздел 2.9.1) Ctrl+L Найти следующую последовательность байт (Search again, раздел 2.10.2) Ctrl+S Поиск данных и/или инструкций (Search bytes■, раздел 2.10.2) Alt+= Установить отобразить окно данных, начиная с адреса, на который ссылается команда, выделенная курсором (Dump position|Reference, раздел 2.9.1) Alt+A Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DX:AX (Dump position|Dump DX:AX, раздел 2.9.1) Alt+B Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:BX (Dump position|Dump ES:BX, раздел 2.9.1) Alt+C Установить отобразить окно данных, начиная с адреса, определяемого значением регистров CS:IP (Dump position|Dump CS:IP, раздел 2.9.1) Alt+D Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:SI (Dump position|Dump DS:SI, раздел 2.9.1) Alt+E Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:DI (Dump position|Dump ES:DI, раздел 2.9.1) Alt+F Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DX (Dump position|Dump DS:DX, раздел 2.9.1) Alt+I Установить отобразить окно данных, начиная с адреса, определяемого значением регистров ES:SI (Dump position|Dump ES:SI, раздел 2.9.1) Alt+J Установить отобразить окно данных, начиная с адреса, определяемого значением регистров DS:DI (Dump position|Dump DS:DI, раздел 2.9.1) Alt+L Установить отобразить окно данных, начиная с адреса инструкции, на которой находится курсор (Dump position|Dump code, раздел 2.9.1) Alt+S Установить отобразить окно данных, начиная с адреса, определяемого значением регистров SS:BP (Dump position|Dump SS:BP, раздел 2.9.1) 3.2.3. Окно регистров. Ctrl+A Восстановить значения регистров, кроме CS, IP и флагов (Restore regs, раздел 2.5) Ctrl+C Восстановить значение пары CS:IP (Restore CS:IP, раздел 2.5) Ctrl+D Уменьшить значение регистра на 1 (Decrement, раздел 2.5) Ctrl+I Увеличить значение регистра на 1 (Increment, раздел 2.5) Ctrl+O Восстановить значение регистра (Zero, раздел 2.5) Ctrl+R Переключение 16/32-битного отображения регистров (16/32-bit mode, раздел 2.5) Ctrl+T Восстановить значение регистра флагов (Restore flags, разделы 2.5 и 2.6) Ctrl+Z Обнулить регистр (Zero, раздел 2.5) 3.2.4. Окно флагов. Space Переключить значение флага (Toggle, раздел 2.6) Ctrl+T Восстановить значение регистра флагов (Restore flags, разделы 2.5 и 2.6) ──────────────────────────────────────────────────────────────────────── 3.3. Отзывы, предложения, ошибки. ──────────────────────────────────────────────────────────────────────── Если у вас есть предложения по поводу того, что нужно еще добавить в отладчик, или вы нашли досадную ошибку в программе или в Описании, то мы будем рады узнать вашу точку зрения (информацию об ошибке). Вы можете написать по следующим адресам: Виктор Гамаюнов (Victor Gamayunov) Internet: tolstolob@mospravda.ru Сергей Пименов (Sergey Pimenov) Internet: sergey@mospravda.ru FIDO: 2:5020/1039.1245 Если вы хотите сообщить об ошибке, то подробно описывайте действия, приводящие к ней или ситуацию, в которой она произошла. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀