мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
asm:lesson6 [20/10/2010 21:08] arabusovasm:lesson6 [21/10/2010 21:30] (текущий) arabusov
Строка 7: Строка 7:
 байт,  а директива DW oпределяет слово. Элемент данных может байт,  а директива DW oпределяет слово. Элемент данных может
 содержать непосредственное значение или константу, определенную как символьная строка или как числовое значение. содержать непосредственное значение или константу, определенную как символьная строка или как числовое значение.
-Другим  способом определения  константы является непосред +Другим  способом определения  константы является непосредственное  значение,  т.е.  указанное  прямо  в  ассемблерной
-ственное  значение,  т.е.  указанное  прямо  в  ассемблерной+
 команде, например: команде, например:
  
Строка 81: Строка 80:
 формате ASCII. формате ASCII.
 Символьная  строка  определяется только директивой  DB, в Символьная  строка  определяется только директивой  DB, в
-котоpой указывается более двух символов в нормальной последо +котоpой указывается более двух символов в нормальной последовательности  слева  направо.   Следовательно,  директива  DB
-вательности  слева  направо.   Следовательно,  директива  DB+
 представляет единственно  возможный  формат  для определения представляет единственно  возможный  формат  для определения
 символьных данных. символьных данных.
Строка 126: Строка 124:
 помнить,  что,  например, символьная константа, определенная помнить,  что,  например, символьная константа, определенная
 как DB '12',  представляет символы ASCII и  генерирует шест. как DB '12',  представляет символы ASCII и  генерирует шест.
-3132, а числовая константа, oпределенная как DB 12, представ +3132, а числовая константа, oпределенная как DB 12, представляет двоичное число и генерирует шест. 0C.
-ляет двоичное число и генерирует шест. 0C.+
 ==== Директива опеделения байта ==== ==== Директива опеделения байта ====
 Из  различных  директив,  определяющих  элементы  данных, Из  различных  директив,  определяющих  элементы  данных,
Строка 138: Строка 135:
 байте это 7F, если подразумевается, что это число знаковое, и 0FF, если подразумевается, что число беззнаковое байте это 7F, если подразумевается, что это число знаковое, и 0FF, если подразумевается, что число беззнаковое
  
- +==== Директива определения слова (DW) ====
-ДИРЕКТИВА ОПРЕДЕЛЕНИЯ СЛОВА (DW)+
 Директива DW определяет  элементы,  которые имеют длину в Директива DW определяет  элементы,  которые имеют длину в
 одно слово (два байта). Символьное выражение в DW ограничено одно слово (два байта). Символьное выражение в DW ограничено
Строка 146: Строка 142:
 определения символьных строк директива DW имеет ограниченное определения символьных строк директива DW имеет ограниченное
 применение. применение.
-   Числовое выражение в DW  может содержать  одно  или более+Числовое выражение в DW  может содержать  одно  или более
 двухбайтовых  констант.  Два  байта  представляются четырьмя двухбайтовых  констант.  Два  байта  представляются четырьмя
 шест.  цифрами.  Наибольшее положительное шест. число в двух шест.  цифрами.  Наибольшее положительное шест. число в двух
Строка 152: Строка 148:
 представляют отрицательные значения. В десятичном исчислении представляют отрицательные значения. В десятичном исчислении
 эти пределы выражаются числами +32767 и -32768. эти пределы выражаются числами +32767 и -32768.
-   В примере на  рис.  5.1  поля FLD1DW  и FLD2DW определяют +Для форматов директив DW,  DD и DQ  ассемблер преобразует
-числовые константы.  Поле FLD3DW определяет адрес - в данном +
-случае смещение  на адрес FLD7DB.  В результате генерируется +
-объектный код 0021  (R  обозначает перемещаемость). Проверяя +
-выше по рисунку,  видно, что относительный адрес поля FLD7DB +
-действительно 0021. +
-   Поле FLD4DW определяет таблицу из пяти числовых констант. +
-Заметим,  что объектный код для каждой константы имеет длину +
-в oдно слово (два байта). +
-   Для форматов директив DW,  DD и DQ  ассемблер преобразует+
 константы  в  шест.  объектный  код,  но  записывает  его  в константы  в  шест.  объектный  код,  но  записывает  его  в
 обратной   последовательности.   Таким   образом  десятичное обратной   последовательности.   Таким   образом  десятичное
Строка 167: Строка 154:
 объектном коде как 3930. объектном коде как 3930.
  
-ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДВОЙНОГО СЛОВА (DD) +==== Директива определения двойного слова (DD) ==== 
------------------------------------------------------------- +Директива DD определяет  элементы,  которые имеют длину в
- +
- +
- +
- +
- +
-Ассемблер для IBM PC. Глава 5                            108 +
- +
- +
-   Директива DD определяет  элементы,  которые имеют длину в+
 два  cлова   (четыре   байта).   Числовое   выражение  может два  cлова   (четыре   байта).   Числовое   выражение  может
 содержать одну или  более констант,  каждая из которых имеет содержать одну или  более констант,  каждая из которых имеет
Строка 185: Строка 163:
 отрицательные значения.  В десятичном исчислении эти пределы отрицательные значения.  В десятичном исчислении эти пределы
 выражаются числами +2147483647 и -2147483648. выражаются числами +2147483647 и -2147483648.
-   В примере на  рис.  5.1  поле FLD3DD  определяет числовую +Ассемблер преобразует все числовые  константы в директиве
-константу.  В поле  FLD4DD генерируется разница  между двумя +
-адресами,  в данном  случае результатом  является длина поля +
-FLD2DB. Поле FLD5DD определяет две числовые константы. +
-   Ассемблер преобразует все числовые  константы в директиве+
 DD  в шест.  представление,  но записывает  объектный  код в DD  в шест.  представление,  но записывает  объектный  код в
 обратной   последовательности.   Таким   образом  десятичное обратной   последовательности.   Таким   образом  десятичное
 значение   12345   преобразуется   в   шест.   00003039,  но значение   12345   преобразуется   в   шест.   00003039,  но
 записывается в oбъектном коде как 39300000. записывается в oбъектном коде как 39300000.
-   Символьное   выражение  директивы  DD   ограничено  двумя 
-символами.  Ассемблер преобразует символы  и  выравнивает их 
-слева в четырехбайтовом  двойном слове,  как показано в поле 
-FLD2DD в объектном коде. 
  
-ДИРЕКТИВА ОПРЕДЕЛЕНИЯ УЧЕТВЕРЕННОГО СЛОВА (DQ) 
------------------------------------------------------------- 
  
-   Директива DQ  определяет  элементы,  имеющие длину четыре+==== Директива определения учетверённого слова (DQ) ==== 
 +Директива DQ  определяет  элементы,  имеющие длину четыре
 слова (восемь байт). Числовое выражение может содержать одну слова (восемь байт). Числовое выражение может содержать одну
 или  более  констант,   каждая  из  которых  имеет  максимум или  более  констант,   каждая  из  которых  имеет  максимум
Строка 211: Строка 180:
  
                     1152921504606846976                     1152921504606846976
- +Ассемблер преобразует  все числовые константы в директиве  DQ в шест.  представление, но записывает
-   В примере на рис.  5.1  поля FLD2DQ и FLD3DQ иллюстрируют +
-числовые  значения.  Ассемблер преобразует  все числовые кон +
-станты в директиве  DQ в шест.  представление, но записывает+
 объектный код в обратной последовательности,  как и в дирек- объектный код в обратной последовательности,  как и в дирек-
 тивах DD и DW. тивах DD и DW.
-   Обработка ассемблером  символьных  строк  в  директиве DQ+Обработка ассемблером  символьных  строк  в  директиве DQ
 aналогично директивам DD и DW. aналогично директивам DD и DW.
  
-ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДЕСЯТИ БАЙТ (DT) +==== Директива определения десяти байт (DT)==== 
------------------------------------------------------------- +Директива DT определяет элементы данных,  имеющие длину в
- +
-   Директива DT определяет элементы данных,  имеющие длину в+
 десять   байт.   Назначение   этой   директивы   связано   с десять   байт.   Назначение   этой   директивы   связано   с
-"упакованными десятичными" числовыми величинами (см. гл.13).+"упакованными десятичными" числовыми величинами.
 По  директиве   DT  генерируются   различные   константы,  в По  директиве   DT  генерируются   различные   константы,  в
-зависимости   от   версии   ассемблера;   для  практического +зависимости   от   версии   ассемблера.
-применения ознакомьтесь с руководством по вашему aссемблера. +
- +
- +
- +
- +
-Ассемблер для IBM PC. Глава 5                            109 +
- +
- +
-   На  рис.   5.1   приведены  примеры   директивы   DT  для +
-неопределенного элемента и для двухсимвольной константы. +
-   Программа на рис.5.1 содержит только сегмент данных. Xотя +
-асcемблер не выдает сообщений об ошибках, в таблице LINK MAP +
-появится  предупреждение:  "Warning:  No  STACK  Segment", а +
-компановщик  LINK  выдаст  "There  were  1  errors detected" +
-(Обнаружена  1   ошибка).  Несмотря  на  это  предупреждение +
-можно  использовать отладчик DEBUG для  просмотра объектного +
-кода, как показано на рис. 5.2. +
-   Правая  сторона  дампа  отчетливо  показывает  символьные +
-данные, как, например, "Personal Computer"+
- +
-НЕПОСРЕДСТВЕННЫЕ ОПЕРАНДЫ +
-------------------------------------------------------------+
  
-   На  рис.  2.1  в  главе  2  было  показано  использование +==== Непосредственные операнды ==== 
-непосредственных операндов. Команда+Команда
  
                     MOV   AX,0123H                     MOV   AX,0123H
Строка 262: Строка 204:
 Многие команды имеют два операнда: первый может быть регистр Многие команды имеют два операнда: первый может быть регистр
 или адрес памяти, а второй - непосредственная константа. или адрес памяти, а второй - непосредственная константа.
- +Использование  непосредственного операнда  более эффектив
------------------------------------------------------------- +
------------------------------------------------------------- +
-               Рис. 5.2. Дамп сегмента данных. +
- +
-   Использование  непосредственного операнда  более эффектив+
 но,  чем oпределение числовой константы в сегменте  данных и но,  чем oпределение числовой константы в сегменте  данных и
 организация cсылки на нее в операнде команды MOV, например, организация cсылки на нее в операнде команды MOV, например,
Строка 274: Строка 211:
           Сегмент кодов:           MOV  AX,AMT1           Сегмент кодов:           MOV  AX,AMT1
  
-   Длина непосредственных операндов+==== Длина непосредственных операндов ====
  
-   Длина непосредственной константы зависит от длины первого+Длина непосредственной константы зависит от длины первого
 операнда.   Например,   следующий  непосредственный  операнд операнда.   Например,   следующий  непосредственный  операнд
 является двухбайтовым, но регистр AL имеет только один байт: является двухбайтовым, но регистр AL имеет только один байт:
Строка 290: Строка 227:
 байт, 0025 и записывает объектный код в виде 2500. байт, 0025 и записывает объектный код в виде 2500.
  
 +==== Непосредственные форматы ====
  
- +Непосредственная константа  может быть шестнадцатиричной,
-Ассемблер для IBM PC. Глава 5                            110 +
- +
- +
- +
-   Непосредственные форматы +
- +
-   Непосредственная константа  может быть шестнадцатиричной,+
 напpимер,   0123H;   десятичной,   например,   291  (которую напpимер,   0123H;   десятичной,   например,   291  (которую
 ассемблер   конвертирует   в   шест.0123);   или   двоичной, ассемблер   конвертирует   в   шест.0123);   или   двоичной,
 например, 100100011В (которая преобразуется в шест. 0123). например, 100100011В (которая преобразуется в шест. 0123).
-   Ниже   приведен   список    команд,   которые   допускают+Ниже   приведен   список    команд,   которые   допускают
 непосредственные операнды: непосредственные операнды:
  
    Команды пересылки и сравнения:  MOV, CMP.    Команды пересылки и сравнения:  MOV, CMP.
    Арифметические команды:         ADC, ADD, SBB, SUB.    Арифметические команды:         ADC, ADD, SBB, SUB.
-   Команды сдвига:       RCL, RCR, ROL, ROR, SHL, SAR, SHR. +   Команды сдвига:                 RCL, RCR, ROL, ROR, SHL, SAR, SHR. 
-   Логические команды:   AND, OR, TEST, XOR.+   Логические команды:             AND, OR, TEST, XOR.
  
-   На  рис.   5.3  приведены  примеры  допустимых  команд  с +==== Директива EQU ==== 
-непосредственными  операндами.  В  последующих  главах будут +Директива EQU не определяет элемент данных, но определяет
-объяснены   команды   арифметического   переноса,  сдвига  и +
-логические  команды.  Поскольку  сейчас  данные  примеры  не +
-предназначены  для  выполнения,  в  них  опущено определение +
-стека и инициализация сегментных регистров. +
-   Для  создания  элементов,  длинее  чем  два  байта, можно +
-использовать цикл  (см.  гл.7)  или  строковые  команды (см. +
-гл.11). +
- +
------------------------------------------------------------- +
------------------------------------------------------------- +
-     Рис. 5.3. Команды с непосредственными данными. +
- +
-ДИРЕКТИВА EQU +
------------------------------------------------------------- +
- +
-   Директива EQU не определяет элемент данных, но определяет+
 значение,  которое может быть использовано для  постановки в значение,  которое может быть использовано для  постановки в
 других   командах.   Предположим,   что  в  сегменте  данных других   командах.   Предположим,   что  в  сегменте  данных
Строка 344: Строка 259:
                     FIELDA    DB   10 DUP (?)                     FIELDA    DB   10 DUP (?)
  
-   Имя, связанное с некоторым значением с помощью директивы+Имя, связанное с некоторым значением с помощью директивы
 EQU, может использоваться в командах, например: EQU, может использоваться в командах, например:
  
-          COUNTR    EQU  05+              COUNTR    EQU  05
  
  
 +                  ...
 +              MOV  CX,COUNTR
  
-Ассемблер для IBM PC. Глава 5                            111 +Ассемблер заменяет имя COUNTR  в команде MOV  на значение
- +
- +
-                    ... +
-                    MOV  CX,COUNTR +
- +
-   Ассемблер заменяет имя COUNTR  в команде MOV  на значение+
 05,  cоздавая операнд с непосредственным значением, как если 05,  cоздавая операнд с непосредственным значением, как если
 бы было закодировано бы было закодировано
Строка 363: Строка 274:
                     MOV  CX,05     ;Ассемблер подставляет 05                     MOV  CX,05     ;Ассемблер подставляет 05
  
-   Здесь приемущество директивы EQU заключается  в  том, что+Здесь приемущество директивы EQU заключается  в  том, что
 многие команды могут использовать  значение, определенное по многие команды могут использовать  значение, определенное по
 имени  COUNTR.  Если это значение  должно  быть изменено, то имени  COUNTR.  Если это значение  должно  быть изменено, то
Строка 379: Строка 290:
 пример  показывает  возможность  использования  в  программе пример  показывает  возможность  использования  в  программе
 слова MPY вместо обычного мнемокода MUL. слова MPY вместо обычного мнемокода MUL.
 +
 +===== Работа с файлами в MS-DOS =====
 +
 +==== Функции типа дескриптора ====
 +
 +В MS-DOS начиная со второй версии файловая система стала иерархической, т.е. появились каталоги (или их можно назвать папками, или директориями). С иерархической файловой системой вы знакомы из опыта общения с OS Windows. Полное имя файла представляет из себя обозначение дисковода, путь до файла и имя файла. По ограничениям MS-DOS размер имени файла не может превышать 8 символов на собственно имя и 3 символов на расширение. Полное имя файла в MS-DOS можно представить, например, так:
 +    C:\SYSTEM\COMMAND.COM
 +Специфика MS-DOS такова, что в имени файла регистр не учитывается, то есть вы можете записать как COMMAND.COM, так и command.com. Приведённый пример вообще говоря представляется в виде ASCIIZ последовательности - это значит, что каждому символу соответствует число из таблицы кодов ASCII символов, а также в конец строки добавляется число 0, то есть запись
 +   C:\SYSTEM\COMMAND.COM
 +преобразуется в
 +   43 3a 5c 53 59 53 54 45 4d 5c 43 4f 4d 4d 41 4e 44 2e 43 4f 4d 00
 +Для работы с файлом с помощью функции типа дескриптора, нужно поместить адрес имени файла в DS:DX. В регистр ah помещается номер функции, после чего вызывается прерывание int 21H. Все функции типа дескриптора после выполнения возвращают опущенный флаг переноса, если функция выполнена успешно и наоборот. Чтобы совершить переход к вашему обработчику ошибки, выполните команду
 +    jc      error
 +где error - указатель на начало обработчика.
 +Теперь рассмотрим некоторые функции типа дескриптора, которые нам сегодня пригодятся.
 +=== Создание файла ===
 +По заданному в коде ASCIIZ пути создаёт новый файл на указанном или текущем диске или на указанном или текущем каталоге. Если указанный файл существует, то он усекается до нулевой длины. В любом случае открывается файл и возвращается дескриптор (16-разрядное число, которое нужно просто запомнить - именно с помощью этого числа в дальнейшем программа сможет обратиться к именно этому файлу).
 +При вызове:
 +  * AH = 3cH
 +  * CX = атрибут (в нашем случае всегда 0)
 +  * DS:DX - адрес строки, содержащей имя файла
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = дескриптор
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Открытие файла ===
 +По заданному в коде ASCIIZ пути открывает файл на указанном или текущем диске или на указанном или текущем каталоге. Возвращается дескриптор.
 +При вызове:
 +  * AH = 3dH
 +  * AL = режим доступа
 +   Биты      Описание
 +   0-2       000=чтение
 +             001=запись
 +             010=чтение/запись
 +  * DS:DX - адрес строки, содержащей имя файла
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = дескриптор
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Закрытие файла ===
 +При вызове:
 +   * AH = 3Eh
 +   * BX =  дескриптор
 +При возврате:
 +Успешно - флаг переноса сброшен
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Чтение файла ===
 +При вызове:
 +  * AH = 3Fh
 +  * BX = дескриптор
 +  * CX = число байт для чтения
 +  * DS:DX = адрес буфера
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = число переданных байтов (может быть меньше CX!)
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Запись в файл ===
 +При вызове:
 +  * AH = 40h
 +  * BX = дескриптор
 +  * CX = число байт для вывода записи
 +  * DS:DX = адрес буфера
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = число переданных байтов (может быть меньше CX!)
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки