ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 10

                                         - 91 -
               
               
           
                       10. КОМАНДЫ МОДИФИКАЦИИ КОДА И ДАННЫХ
               
               
               
                                     СОДЕРЖАНИЕ
               
                                                                   Лист
               
               10.     Команды модификации кода и данных.............. 91
               10.1.   Введение....................................... 92
               10.2.   Команда "Ассемблер" (A)........................ 92
               10.3.   Команды ввода данных (E..)..................... 94
               10.3.1. Команда "Ввести" (E)........................... 95
               10.3.2. Команда "Ввод байт" (EB)....................... 95
               10.3.3. Команда "Ввод ASCII" (EA)...................... 96
               10.3.4. Команда "Ввод целых" (EI)...................... 96
               10.3.5. Команда "Ввод беззнаковых целых" (EU).......... 96
               10.3.6. Команда "Ввод слов" (EW)....................... 97
               10.3.7. Команда "Ввод двойных слов" (ED)............... 97
               10.3.8. Команда "Ввод коротких плавающих" (ES)......... 98
               10.3.9. Команда "Ввод длинных плавающих" (EL).......... 98
               10.3.10.Команда "Ввод 10-байтовых плавающих" (ET)...... 99
               10.4.   Команда "Регистр" (R).......................... 99
           
           
                
.
                                      - 92 -
         
         
               10.1. Введение
                
               CodeView отладчик оснащен следующими командами, модифициру-
         ющими код и данные в памяти:
                
                   Команда.                     Действие.
                
                Ассемблировать(A)          Модификация кода.
                Ввести (E)                 Модификация памяти.
                Регистр(R)                 Модификация     значений
                                           регистров и их флагов.

               Изменения кода -- временные. Их можно делать в процессе  от-
         ладки,  но  их нелзя сохранить. Для сохранения необходимо изменить
         исходный текст и перекомпилировать.
               Примечание:
               Команда рестарта автоматически восстанавливает все изменения
         кода и инициализированных данных.
                
                
               10.2. Команда "Ассемблер" (A)
                
               Команда ассемблировать позволяет вводить в память в символь-
         ной мнемонике  команды  8086-семейства  процессоров  (8086,  8087,
         8088,  80196,  80287  и 80286 незащищенного) по специфицированному
         адресу.
               Примечание:
               CodeView распознает и  интерпретирует  только  команды  8086
         процессора, но не 80286.
                
               Mouse.
               Эту команду нельзя ввести mouse'ом.
                
               Клавиатура.
               Эту команду нельзя ввести спецключами.
                
               Диалоговая.
               Для выполнения команды "текущее расположение" введите диало-
         говую команду в следующем синтаксисе:
                A[<адрес>]
               , где <адрес> -- адрес, с которого будут водиться ассемблер-
         ные  команды.  Если <адрес> не специфицирован, то по умолчанию бе-
         рется текущий адрес, на который указывают регистры CS:IP.
               После ввода команды отладчик выдаст адрес ассемблирования  и
         будет  ожидать  ассемблерную команду в стандартной 8086 мнемонике.
         CodeView не чувствителен к большим и малым буквам в командах.
               Для ввода ассемблерной инструкции введите  ее  мнемоническое
         имя и нажмите Enter. CodeView введет команду, выдаст следующий ад-
         рес  ассемблирования и снова перейдет в режим ожидания инструкции.
         Для выхода из режима ассемблирования  нажмите  Enter  в  ответ  на
         приглашение.
               Если инструкция содержит ошибку, отладчик выдаст сообщение ^
         Sintax  error,  где  карет символ будет указывать на первый символ
         сообщения, который CodeView не смог  проинтерпретировать,  перевы-
         даст тот же ассемблерный адрес и перейдет в состояние ожидания ко-

                                      - 93 -
         
         
         манды.
               Следующие 9 правил необходимо применять при вводе ассемблер-
         ной инструкций:
               1) мнемоника far-return'а -- RETF ;
               2)  в  команде  копирования  строк должен содержаться формат
         строк (байтовый/словный); возможны MOVSW и MOVSB команды для копи-
         рования слов и байт;
               3) CodeView  автоматически  различает  короткие,  ближние  и
         дальние  JMP'ы  и CALL'ы; явное указание префиксов NEAR и FAR пре-
         фиксов, как в следующих примерах, может переназначить их:
                JMP 0x502
                JMP NEAR 0x505
                JMP FAR  0x50A
                NEAR префикс в написании может быть сокращен до NE;
               4) отладчик не различает словный и байтовый  формат  операн-
         дов,  формат необходимо указывать явно с помощью WORD PTR (WO) или
         BYTE PTR (BY) префиксов:
                MOV WORD PTR[BP],1
                MOV BYTE PTR[SI-1],symbol
                MOV WO PTR[BP],1
                MOV BY PTR[SI-1],symbol
               5) CodeView не различает, когда операнд является ссылкой  на
         память или яляется непосредственным данным.
               Отладчик  использует  соглашение,  что  операнд в квадратных
         скобках является ссылкой на память. Примеры:
                MOV AX,0x21
                MOV AX,[0x21]
               Первый оператор загружает 0x21 в регистр AX, второй  --  со-
         держимое памяти DS:0x21 ;
               6)  DB  инструкции ассемблируют память непосредственно в па-
         мять, а DW -- слова:
                DB 1,2,3,4,"Это -- пример"
                DW 1000,2000,3000,"Batch"
               7) CodeView поддерживает все формы косвенной регистровой ад-
         ресации, как в следующих примерах:
                ADD BX,[BP+2].[SI-1]
                POP [BP+DI]
                PUSH [SI]
               8) поддерживаются все имена инструкций-синонимов, как напри-
         мер:
                LOOPZ 0x100
                LOOPE 0x100
                JA    0x200
                JNBE  0x200
               При дезассемблировании CodeView может вывести команды, си-
         нонимы тем, которые вы ввели.
               9) нельзя вводить команды 8087/80287  сопроцессора,  если  в
         системе нет этого типа процессора. Например, Wait инструкция вызо-
         вет зависание при попытке ее выполнить.
               Примеры:
                >U 0x40 L1
                39B0:0040  89C3     MOV  BX,AX
                >A 0x40
                39B0:0040  MOV  CX,AX
                39B0:0042

                                      - 94 -
         
         
                >U 0x40 L1
                39B0:0040  B9C3     MOV  CX,AX
                >
                
                
               10.3. Команды ввода данных (E..)
                
               Отладчик  имеет  несколько команд для ввода данных в память.
         Этими командами можно модифицировать данные и код, но  код  значи-
         тельно  легче  модифицировать  командой ассемблера (A). Вот список
         команд ввода:
                Команда                     Имя команды.
                E                 Ввести (в умалчиваемом типе).
                EB                Ввести байты.
                EA                Ввести ASCII.
                EI                Ввести целые.
                EU                Ввести беззнаковые целые.
                EW                Ввести слова.
                ED                Ввести двойные слова.
                ES                Ввести короткие с плавающей.
                EL                Ввести длинные с плавающей.
                ET                Ввести 10-байтовые с плавающей.
                
               Mouse.
               Эту команду нельзя ввести mouse'ом.
                
               Клавиатура.
               Эту команду нельзя ввести спецключами.
                
               Диалоговая.
               Для выполнения команды ввода данных в память введите  диало-
         говую команду в следующем синтаксисе:
                E[<тип>] <адрес> [<список>]
               ,  где <тип> -- однобуквенный спецификатор, указывающий тип,
         в котором будут введены данные в память; <адрес> --  это  адресное
         выражение,  в <сегмент>:<смещение> виде, по которому будут введены
         данные. Если сегмент не указан, то по умолчанию  берется  DS  сег-
         мент.
               <Список>  состоит  из  одного или более выражений, значения
         которых будут введены в память. Если хотя бы одно выражение  оши-
         бочно,  CodeView  выдаст сообщение об ошибке. Все данные, стоящие
         перед ошибочным выражением, будут введены, а после него -- нет.
               Выражение в <списке> высвечивается в текущем радиксе  (сис-
         теме  счисления)  и  преобразовывается к типу, специфицированному
         <типом>.
               Если  список  не дан, отладчик, не обнаружив его, перейдет в
         диалоговый режим и выдаст приглашение (его  вид:  <текущее  значе-
         ние><.>) на ввод значения в заданном <типе>.
               Команды  ввести байт, ASCII, слово, двойное слово требуют на
         входе 16-ричные значения, ввод целых и беззнаковых  целых  требует
         знаковых  и беззнаковых 10-тичных значений, ввод коротких, длинных
         и 10-байтовых плавающих -- чисел в плавающем формате.
               Следующие команды используются при вводе данных в диалоговом
         режиме:
               - для замены значения, введите новое значение;

                                      - 95 -
         
         
               - для пропуска нажмите пробел;
               - для возврата к предыдущему значению наберите '\';
               - для выхода из режима диалога нажмите Enter.
               В разделах 10.2.1-10.2.10 описываются различные форматы  ко-
         манды Enter.
               Примеры:
                >EW place 16 32        ; * Пример 1
                >EW place              ; * Пример 2
                3DA5:0B20  00F3._
               Пример 1 -- ввод 2-х слов по адресу place. Пример 2 -- илюс-
         трация  перехода в диалоговый режим ввода. Для ввода значений 16 и
         32 (они вводятся в 16-ричном радиксе) наберите 10, <пробел>, 20  и
         Enter.
               Примеры работы в диалоговом режиме:
                3DA5:0B20  00F3._
                3DA5:0B20  00F3.10_
                3DA5:0B20  00F3.10  4F20._
                3DA5:0B20  00F3.10  4F20.20_
                3DA5:0B20  00F3.10  4F20.20  3DC1.\
                3DA5:0B20  00F3.10  0020._
               Вот  последовательность  набранных ключей: 10, <пробел>, 20,
         <пробел>, \, Enter.
                
                
               10.3.1. Команда "Ввести" (E)
                
               Синтаксис:
               E <адрес> [<список>]
               Команда ввода вводит одно или несколько значений  в  память
         по специфицированному адресу. Данные вводятся в формате умолчива-
         емого  типа,  специфицированного  последней командой ввода, дампа
         или сторожевыми командами. Если ни одна из этих  команд  не  была
         введена, то умалчиваемый тип -- байтовый.
               Эту  команду  нужно применять с осторожностью. Если значение
         выражения имеет тип "слово", а умалчиваемый тип -- "байтовый",  то
         при вводе произойдет усечение старшего байта.
               Примечание:
               Команда ввода имеет командную букву E, как и команда "выпол-
         нять  медленно" (см. главу 5), но они различаются тем, что команда
         ввода ВСЕГДА имеет аргументы.

                
               10.3.2. Команда "Ввод байт" (EB)
                
               Синтаксис:
               EB <адрес> [<список>]
               Команда ввода вводит одно или несколько значений в память по
         специфицированному адресу. При вводе данные преобразуются к байто-
         вому типу.
               <Список> вводится как список выражений,  разделенных  пробе-
         лом.  Значения выражений вычисляются в текущем радиксе. Если аргу-
         мент не указан, отладчик перейдет в диалоговый  режим,  в  котором
         данные вводятся в 16-ричном формате.
               Командой  "ввод-байт"  можно вводить так же и строки, совсем
         как командой "Ввод ASCII".

                                      - 96 -
         
         
               Примеры:
                >EB 0x100 10 20 (30+5)  ; * Пример 1
                >EB 0x100               ; * Пример 2
                3DA5:0100  130F.A
                >
                
               Пример 1 -- ввод 3-х байт по адресу 0x100 текущего сегмента.
         Пример 2 -- ввод байта 0xA по адресу 0x100 текущего сегмента в ди-
         алоговом режиме.
                
                
               10.3.3. Команда "Ввод ASCII" (EA)
                
               Синтаксис:
                EA <адрес> [<список>]
                
               Команда ввода ASCII аналогична команде ввода байт.  Аргумен-
         том команды ввода могут быть так же и строки.
                
               Пример:
                >EA massage "Can\'t open file"
                
               Пример  ввод  строковой константы "Can\'t open file" по адресу
         massage.
           
                
               10.3.4. Команда "Ввод целых" (EI)
                
               Синтаксис
                EI <адрес> [<список>]
               Команда ввода целых предназначена для ввода одного или  нес-
         кольких  слов в память по специфицированному адресу в знаковом де-
         сятичном формате.
               <Список> вводится как список выражений,  разделенных  пробе-
         лом.  Значения выражений вычисляются в текущем радиксе. Если аргу-
         мент не указан, отладчик перейдет в диалоговый  режим,  в  котором
         данные вводятся в знаковом 10-тичном формате.
               Примеры:
                >EB 0x100 -10 20 -(30+5)  ; * Пример 1

                >EB 0x100                 ; * Пример 2
                3DA5:0100  130F.-10
                >
                
               Пример  1  --  ввод 3-х слов в знаковом 10-тичном формате по
         адресу 0x100 текущего сегмента. Пример 2 -- ввод слова -10 по  ад-
         ресу 0x100 текущего сегмента в диалоговом режиме.
                
                
               10.3.5. Команда "Ввод беззнаковых целых" (EU)
               
               Синтаксис:
                EU <адрес> [<список>]
               

                                      - 97 -
         
         
               Команда  ввода беззнаковых целых предназначена для ввода од-
         ного или нескольких слов в память по специфицированному  адресу  в
         беззнаковом десятичном формате.
               <Список>  вводится  как список выражений, разделенных пробе-
         лом. Значения выражений вычисляются в текущем радиксе. Если  аргу-
         мент  не  указан,  отладчик перейдет в диалоговый режим, в котором
         данные вводятся в беззнаковом 10-тичном формате.
               Примеры:
                >EB 0x100 10 20 (30+5)  ; * Пример 1
                >EB 0x100                 ; * Пример 2
                3DA5:0100  130F.10
                >
                
               Пример 1 -- ввод 3-х слов в беззнаковом 10-тичном формате по
         адресу 0x100 текущего сегмента. Пример 2 -- ввод слова 10 по адре-
         су 0x100 текущего сегмента в диалоговом режиме.
                
                
               10.3.6. Команда "Ввод слов" (EW)
                
               Синтаксис
                EW <адрес> [<список>]
               Команда ввода слов предназначена для ввода одного  или  нес-
         кольких  слов  в  память  по специфицированному адресу в 16-ричном
         формате.
               <Список> вводится как список выражений,  разделенных  пробе-
         лом.  Значения выражений вычисляются в текущем радиксе. Если аргу-
         мент не указан, отладчик перейдет в диалоговый  режим,  в  котором
         данные вводятся в 16-ричном формате.
               Примеры:
                
                >EB 0x100 0x10 0x2A0      ; * Пример 1
                >EB 0x100                 ; * Пример 2
                3DA5:0100  130F.AF10
                >
                
               
               Пример  1  --  ввод  2-х  слов в 16-ричном формате по адресу
         0x100 текущего сегмента. Пример 2 -- ввод  слова  AF10  по  адресу
         0x100 текущего сегмента в диалоговом режиме.
                
                
               10.3.7. Команда "Ввод двойных слов" (ED)
                
               Синтаксис
                EW <адрес> [<список>]
               Команда  ввода  слов предназначена для ввода одного или нес-
         кольких 4-байтовых слов в память по  специфицированному  адресу  в
         16-ричном формате.
               <Список>  вводится  как список выражений, разделенных пробе-
         лом. Значения выражений вычисляются в текущем радиксе. Если  аргу-
         мент  не  указан,  отладчик перейдет в диалоговый режим, в котором

                                      - 98 -
         
         
         данные вводятся в 16-ричном формате.
               Примеры:
                >EB 0x100 0x10 0x2A0      ; * Пример 1
                >EB 0x100                 ; * Пример 2
                3DA5:0100  21FC:130F.AF10
                >
                
               Пример 1 -- ввод 2-х 4-байтовых слов в 16-ричном формате  по
         адресу 0x100 текущего сегмента. Пример 2 -- ввод слова AF10 по ад-
         ресу 0x100 текущего сегмента в диалоговом режиме.
                
                
               10.3.8. Команда "Ввод коротких плавающих" (ES)
                
               Синтаксис
                ES <адрес> [<список>]
               Команда ввода коротких плавающих предназначена для ввода од-
         ного  или нескольких 4-байтовых плавающих в память по специфициро-
         ванному адресу.
               <Список>  вводится как список выражений, разделенных пробе-
         лом. Выражения должны быть в плавающем 10-тичном формате, несмот-
         ря на текущий радикс. Если аргумент не указан, отладчик  перейдет
         в  диалоговый режим, в котором данные вводятся в плавающем форма-
         те.
               Примеры:
                >ES 0x100  1/4   1.0E-07     ; * Пример 1
                >ES pi                       ; * Пример 2
                3DA5:0100  42 79 74 65    7.215589E+022     3.1415926
                >
                
               Пример 1 -- ввод 2-х 4-байтовых плавающих в 10-ричном плава-
         ющем  формате  по адресу 0x100 текущего сегмента. Пример 2 -- ввод
         плавающего 3.1415926 в pi.
                
                
               
               10.3.9. Команда "Ввод длинных плавающих" (EL)
                
               Синтаксис
                EL <адрес> [<список>]
               Команда ввода коротких плавающих предназначена для ввода од-
         ного или нескольких 8-байтовых плавающих в память по  специфициро-
         ванному адресу.
               <Список>  вводится  как список выражений, разделенных пробе-
         лом. Выражения должны быть в плавающем 10-тичном формате, несмотря
         на  текущий  радикс.  Если аргумент не указан, отладчик перейдет в
         диалоговый режим, в котором данные вводятся в плавающем формате.
               Примеры:
                >ES 0x100  1/4   1.0E-07     ; * Пример 1
                >ES pi                       ; * Пример 2
           3DA5:0100  42 79 74 65 DC 0F 49 40  5.012391E+001  3.1415926
                >
                

                                      - 99 -
         
         
               Пример 1 -- ввод 2-х 8-байтовых плавающих в 10-ричном плава-
         ющем формате по адресу 0x100 текущего сегмента. Пример 2  --  ввод
         плавающего 3.1415926 в pi.
                
                     
               10.3.10. Команда "Ввод 10-байтовых плавающих" (ET)
                
               Синтаксис:
                ET <адрес> [<список>]
               Команда ввода коротких плавающих предназначена для ввода од-
         ного или нескольких 10-байтовых плавающих в память по специфициро-
         ванному адресу.
               <Список>  вводится  как список выражений, разделенных пробе-
         лом. Выражения должны быть в плавающем 10-тичном формате, несмотря
         на  текущий  радикс.  Если аргумент не указан, отладчик перейдет в
         диалоговый режим, в котором данные вводятся в плавающем формате.
               Примеры:
                >ES 0x100  1/4   1.0E-07     ; * Пример 1
                >ES pi                       ; * Пример 2
         3DA5:0100  42 79 74 65 DC 0F 49 40 7F BD  5.012391E+001  3.1415926
                >
                
               Пример 1 -- ввод 2-х 10-байтовых плавающих в 10-ричном  пла-
         вающем формате по адресу 0x100 текущего сегмента. Пример 2 -- ввод
         плавающего 3.1415926 в pi.
                
                
               10.4. Команда "Регистр" (R)
                
               Команда регистр имеет 2 функции. Она отображает значения ре-
         гистров ЦП и она также позволяет изменять значения регистров. Воз-
         можности  отображения этой команды описаны в главе 6"Контроль дан-
         ных и выражений".
               
           
               Mouse.
               Mouse'ом можно изменить только флаги  состояния  процессора.
         Для  изменения  статуса  какого-либо флага необходимо при открытом
         (ключем F2 или через Option меню) окне регистров  "указать" флаг и
         "щелкнуть" на нем любой кнопкой. В результате выполнения этой  ко-
         манды  в соответсвии со статусом изменится имя флага, и, в цветном
         режиме, цвет или степень яркости.
                
               Клавиатура.
               Содержимое регистров и флагов нельзя изменить спецключами.
                
               Диалоговая.
               Для изменения значения регистра введите диалоговую команду в
         следующем синтаксисе:
                R [<имя регистра>[[=]<выражение>]
               Если не указано <выражение>, CodeView высветит текущее  зна-
         чение  регистра и перейдет в режим ожидания нового значения. Набе-
         рите <выражение> и нажмите Enter, или просто Enter, если вы только

                                      - 100 -
         
         
         просматривали значение регистра.
               <Именами регистров> могут дыть только следующие  имена:  AX,
         BX, CX, DX, CS, DS, SS, ES, SP, BP, SI, DI, IP или F (для флагов).
               Для  изменения значений флагов укажите <имя регистра> F. Ко-
         манда высветит текущее значения флагов  в  2-символьной  мнемонике
         (см.  табл. 10.1) и приглашение. Введите через пробел в 2-символь-
         ной символике новые значения тех флагов, которые вы  хотите  изме-
         нить и нажмите Enter.
               Если  вы  указали неправильное имя флага, появится сообщение
         об ошибке; флаги, указанные до ошибочного имени,  будут  изменены,
         остальные -- нет.
               
            Имя флага     Установ     Установ     Чистка     Чистка
                          диалог.     оконной     диалог.    оконной
           ---------------------------------------------------------
            Overflow       OV        overflow       NV      novrflow
            Direction      DN        down           UP        up
            Interrupt      EI        enable         DI      disable
            Sign           NC        negative       PL      positive
            Zero           ZR        zero           NZ      not zero
            Auxiliary      AC        auxcarry       NA      no auxcy
                carry
            Parity         PE        even           PO        odd
            Carry          CY        carry          NC      no carry
           ---------------------------------------------------------
                
               Примеры:
                >R   IP  0x100     ; * Пример 1
                >
               Пример  1  --  изменение  содержимого  IP  регистра  на  256
         (0x100).

                >R   AX            ; * Пример 2
                AX 0E00
                :256
                >
               Пример 2 -- изменение в интерактивном режиме содержимого  AX
         регистра на 256.
                >R   F UP EI PL    ; * Пример 3
                >R   F             ; * Пример 4
        NV(OV)  UP(DN) EI(DI) PL(NC) NZ(ZR) AC(NA) PE(PO) NC(CY) -OV DI ZR
                >R   F
           OV(NV)  UP(DN) DI(EI) PL(NC) ZR(NZ) AC(NA) PE(PO) NC(CY)
.
         


Яндекс цитирования