Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 2 3 4 5 6 7  8 9 10 11 12 13 14 ... 85
старте первого примера. Команда отобразится в виде:

               13C6:0100      A10000    MOV  AX,[0000]

     Так, как регистр CS содержит 13C6, то CS:100 содержит первую  команду
A10000. Отладчик интерпретирует эту команду как MOV и определяет ссылку  к
первому адресу [0000] в сегменте данных.  Квадратные скобки необходимы для
указания ссылки к адресу памяти, а не к непосредственным данным.
     Если бы квадратных скобок не было, то команда

                               MOV AX,0000

oбнулила бы регистр AX  непосредственным значением 0000.
     Теперь введем команду T.  Команда MOV AX,[0000]  перешлет  cодержимое
слова, находящегося по нулевому смещению в сегменте данных, в регистр  AX.
Содержимое 2301 преобразуется командой в 0123 и помещается в регистр AX.
     Следующую команду ADD можно выполнить, введя еще  раз  команду  T.  В
результате содержимое слова в DS по смещению 0002 прибавится в регистр AX.
Теперь регистр AX будет содержать сумму 0123 и 0025, т.е. 0148.
     Следующая команда MOV [0004],AX выполняется опять  по  вводу  T.  Эта
команда пересылает содержимое регистра AX в слово по  смешению  0004.  Для
просмотра изменений содержимого сегмента данных введите  D  DS:00.  Первые
девять байт будут следующими:

          значение в сегменте данных: 23 01 25 00 48 01 2A 2A 2A
          величина смещения:          00 01 02 03 04 05 06 07 08

Значение 0148, которое было занесено из регистра AX в  сегмент  данных  по
смещению 04 и 05, имеет обратное  представление  4801.  Заметьте  что  эти
шест. значения представлены в правой части  экрана  их  символами  в  коде
ASCII.  Например, шест.23 генерируeтся в символ #, а шест.25 - в символ %.
Три байта с шест. значениями 2A высвечиваются в виде трех звездочек (***).
Левая  часть  дампа  показывает  действительные  машинные  коды,   которые
находятся в памяти.  Правая часть дампа только помогает проще локализовать
символьные (срочные) данные.
     Для просмотра содержимого сегмента кодов введите D  DS:100  так,  как
показано на рис.2.3. В  заключении  введите  Q  для  завершения  работы  с
программой.


     МАШИННАЯ АДРЕСАЦИЯ
     ________________________________________________________________

     Для доступа к машинной  команде  процессор  определяет  ее  адрес  из
содержимого  регистра  CS  плюс  смещение  в  регистре    IP.    Например,
предположим, что  регистр  CS  содержит  шест.04AF  (действительный  адрес
04AF0), а регистр IP содержит шест. 0023:

                          CS:      04AF0
                          IP:       0023
                                   -----
               Адрес команды:      04B13

     Если, например, по адресу 04B13 находится команда:

               A11200         MOV  AX,[0012]
               |
          Адрес 04B13

то в памяти по адресу 04B13  содержится  первый  байт  команды.  Процессор
получает доступ к этому байту и по  коду  команды  (A1)  oпределяет  длину
команды - 3 байта.
     Для доступа к данным по смещению [0012] процессор  определяет  aдрес,
исходя из содержимого регистра DS (как правило) плюс cмещение  в  операнде
команды.  Если  DS  содержит  шест.04B1  (реальный  адрес    04B10),    то
результирующий адрес данных определяется cледующим образом:

                     DS:      04B10
               Смещение:       0012
                              -----
           Адрес данных:      04B22

     Предположим, что  по  адресам  04B22  и  04B23  содержатся  следующие
данные:

               Содержимое:         24        01
                                   |         |
               Адрес:           04B22     04B23

     Процессор выбирает значение 24 из ячейки по адресу 04B22  и  помещает
его в регистр AL, и значение 01 по адресу 04B23 - в регистр AH. Регистр AX
будет содержать в  результате  0124.  В  процессе  выборки  каждого  байта
команды процессор увеличивает значение регистра IP на единицу, так  что  к
началу выполнения следующей команды в нашем  примере  IP  будет  содержать
смещение  0026.  Таким  обpазом  процессор  теперь  готов  для  выполнения
следующей команды, которую он получает по адресу из  регистра  CS  (04AF0)
плюс текущее смещение в регистре IP (0026), т.е. 04B16.


                             Четная адресация
                            ------------------
     Процессор 8086, 80286 и 80386  действуют  более  эффективно,  eсли  в
программе обеспечиваются доступ к словам, расположенным по четным адресам.
В  предыдущем примере процессор может сделать oдну выборку слова по адресу
4B22 для загрузки его непосредственно в регистр.  Но если слово начинается
на  нечетном  адресе,  процессор  выполняет двойную выборку.  Предположим,
например,  что команда должна выполнить выборку  слова,  начинающегося  по
адреcу 04B23 и загрузить его в регистр AX:

               Содержимое памяти:  |хх|24|01|хх|
                                       |
                           Адрес:  04B23

Сначала процессор получает доступ к  байтам  по  адресам  4B22  и  4B23  и
пересылает байт из ячейки 4B23 в регистр AL.  Затем он получает  доступ  к
байтам по адресам 4B24 и 4B25 и пересылает байт из ячейки 4B23  в  регистр
AH. В результате регистр AX будет содержать 0124.
     Нет необходимости в каких-либо специальных  методах  программирования
для получения четной или нечетной адресации,  не обязательно  также  знать
является  адрес  четным  или нет.  Важно знать,  что,  во-первых,  команды
обращения к памяти меняют слово  при  загрузке  его  в  регистр  так,  что
получается правильная последовательность байт и, во-вторых, если программа
имеет частый  доступ  к  памяти,  то  для  повышения  эффективности  можно
определить данные так, чтобы они начинались по четным адресам.
     Например, поскольку  начало  сегмента  должно  всегда  находиться  по
четному адресу, первое поле данных начинается также по  четному  адресу  и
пока следующие поля определены как слова, имеющие четную  длину,  они  все
будут  начинаться  на  четных  адресах.  В  большинстве  случаев,  однако,
невозможно заметить ускорения работы  при  четной  адресации  из-за  очень
высокой скорости работы процессоров.
     Ассемблер имеет директиву EVEN,  которая вызывает выравнивание данных
и команд на четные адреса памяти.


     ПРИМЕР МАШИННЫХ КОДОВ: ОПРЕДЕЛЕНИЕ РАЗМЕРА ПАМЯТИ
     ________________________________________________________________

     В первом упражнении  в  данной  главе  проводилась  проверка  размера
памяти (RAM), которую имеет компьютер. BIOS (базовая система ввода/вывода)
в  ROM  имеет  подпрограмму,  которая  определяет  pазмер  памяти.   Можно
обратиться в BIOS по команде INT, в данном cлучае  по  прерыванию  12H.  В
результате BIOS возвращает  в  регистр  AX  размер  памяти  в  килобайтах.
Загрузите в память DEBUG и введите для INT 12H и  RET  следующие  машинные
коды:

                            E CS:100 CD 12 CB

Нажмите R (и  Return)  для  отображения  содержимого  регистров  и  первой
команды. Регистр IP содержит 0100, при этом высвечивается команда INT 12H.
Теперь нажмите T  (и  Return)  несколько  раз  и  просмотрите  выполняемые
команды BIOS  (отладчик  показывает  мнемокоды,  хотя  в  действительности
выполняются машинные коды):

               STI
               PUSH  DS
               MOV   AX,0040
               MOV   DS,AX
               MOV   AX,[0013]
               POP   DS
               IRET

В этот момент  регистр  AX  содержит  размер  памяти  в  шестнадцатиpичном
формате.  Теперь введите еще раз команду T для выхода из BIOS и возврата в
вашу программу.  На экране появится команда RET  для  машинного  кода  CB,
который был введен вами.


     СПЕЦИАЛЬНЫЕ СРЕДСТВА ОТЛАДЧИКА
     ________________________________________________________________

     В операционной системе DOS версии 2.0  и  старше  можно  использовать
DEBUG для ввода команд ассемблера так же, как и команд машинного языка. На
практике можно пользоваться обоими методами.


                                Команда A
                               -----------
     Команда отладчика A (Assemble) переводит DEBUG в режим приема  команд
ассемблера и перевода  их  в  машинные  коды.  Установим  начальный  адрес
следующим образом:

               A 100 [Return]

Отладчик выдаст   значение   адреса  сегмента  кодов  и  смещения  в  виде
хххх:0100.  Теперь можно вводить каждую команду, завершая клавишей Return.
Когда вся программа будет введена, нажмите снова клавишу Return для выхода
из режима ассемблера. Введите следующую программу:

               MOV  AL,25     [Return]
               MOV  BL,32     [Return]
               ADD  AL,BL     [Return]
               RET            [Return]

по завершению на экране будет следующая информация:

               хххх:0100      MOV  AL,25
               хххх:0102      MOV  BL,32
               хххх:0104      ADD  AL,BL
               хххх:0106      RET

В этот момент отладчик готов  к  приему  следующей  команды.  При  нажатии
Return операция будет прекращена.
     Можно видеть, что отладчик определил стартовые адреса каждой команды.
Прежде чем выполнить программу, проверим сгенерированные машинные коды.


                                Команда U
                               -----------
     Команда отладчика U (Unassemble) показывает машинные коды для  команд
ассемблера.  Необходимо  сообщить  отладчику  адреса  первой  и  последней
команды, которые необходимо просмотреть  (в  данном  cлучае  100  и  106).
Введите:

               U 100,106 [и Return]

и на экране появится

               хххх:0100      B025      MOV  AL,25
               хххх:0102      B332      MOV  BL,32
               хххх:0104      00D8      ADD  AL,BL
               хххх:0106      C3        RET

Теперь проведем трассировку выполнения программы, начиная с команды R  для
вывода содержимого регистров и первой команды программы.  С помощью команд
T выполним последовательно все команды программы.
     Теперь вы знаете, как вводить программу в машинном коде или на  языке
ассемблера.  Обычно используется ввод на языке ассемблера, когда  машинный
код неизвестен, а ввод в машинном коде - для изменения программы во  время
выполнения.  Однако в действительности программа DEBUG  предназначена  для
отладки программ и в следующих  главах  основное  внимание  будет  уделено
использованию языка ассемблера.


                    Сохранение программы из отладчика
                   -----------------------------------
     Можно использовать DEBUG для сохранения программ на диске в следующих
случаях:

          1. После загрузки программы в память  машины  и  ее  модификации
     необходимо сохранить измененный вариант. Для этого следует:

               - загрузить  программу  по  ее  имени:  DEBUG  n:имя  файла
          [Return]
               - просмотреть  программу  с  помощью  команды  D  и  ввести
          изменения по команде E,
               - записать измененную программу: W [Return]

          2. Необходимо с  помощью  DEBUG  написать  небольшую  по  объему
     программу и сохранить ее на диске. Для этого следует:

               - вызвать отладчик DEBUG,
               - с помощью  команд  A  (assemble)  и  E  (enter)  написать
          программу,
               - присвоить  программе имя:  N имя файла.COM [Return].  Тип
          программы  должен  быть  COM  (см.   гл.6   для   пояснений   по
          COM-файлам),
               - так  как  только  программист  знает,  где  действительно
          кончается его программа, указать  отладчику  длину  программы  в
          байтах. В последнем примере концом программы является команда

               хххх:0106      C3   RET

          Эта команда однобайтовая и поэтому размер программы будет  равен
          106 (конец) минус 100 (начало), т.е. 6.
Предыдущая страница Следующая страница
1 2 3 4 5 6 7  8 9 10 11 12 13 14 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама