мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| asm:lesson6 [20/10/2010 20:57] – создано arabusov | asm:lesson6 [21/10/2010 21:30] (текущий) – arabusov | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Урок 6 ====== | ====== Урок 6 ====== | ||
| ===== Работа с памятью ===== | ===== Работа с памятью ===== | ||
| + | Сегмент | ||
| + | рабочих полей и областей | ||
| + | с имеющимися директивами в ассемблере | ||
| + | данных | ||
| + | байт, | ||
| + | содержать непосредственное значение или константу, | ||
| + | Другим | ||
| + | команде, | ||
| + | |||
| + | MOV AL,20H | ||
| + | |||
| + | В этом | ||
| + | частью ма шинного объектного кода. Непосредственное значение | ||
| + | ограничено | ||
| + | может быть | ||
| + | использование конcтанты. | ||
| + | |||
| + | ==== Директивы определения данных ==== | ||
| + | |||
| + | Ассемблер | ||
| + | во-первых, | ||
| + | cодержимому. Рассмотрим основной формат определения данных: | ||
| + | |||
| + | | ||
| + | |||
| + | - Имя | ||
| + | квадратными | ||
| + | ссылки | ||
| + | посредством имени. | ||
| + | разделе " | ||
| + | - Для | ||
| + | директивы: | ||
| + | DQ (учетверенное слово) и DT (десять байт). | ||
| + | - Выражение может содержать константу, | ||
| + | |||
| + | FLD1 DB 25 | ||
| + | |||
| + | или знак вопроса для неопределенного значения, | ||
| + | |||
| + | FLDB DB ? | ||
| + | |||
| + | Выражение может содержать несколько констант, | ||
| + | запятыми и ограниченными только длиной строки: | ||
| + | |||
| + | FLD3 DB 11, 12, 13, 14, 15, 16, ... | ||
| + | |||
| + | Ассемблер определяет эти константы в виде последовательности | ||
| + | cмежных | ||
| + | константу, | ||
| + | представить как FLD3+0). Например команда | ||
| + | |||
| + | MOV AL,FLD3+3 | ||
| + | |||
| + | загружает | ||
| + | допускает также повторение константы в следующем формате: | ||
| + | |||
| + | [имя] | ||
| + | |||
| + | Следующие три примера иллюстрируют повторение: | ||
| + | |||
| + | DW 10 DUP(? | ||
| + | DB 5 DUP(14) | ||
| + | DB 3 DUP(4 DUP(8)); | ||
| + | |||
| + | В третьем примере сначала генерируется | ||
| + | давая в pезультате двенадцать восмерок. | ||
| + | Выражение может содержать символьную | ||
| + | константу. | ||
| + | |||
| + | ==== Символьные строки ==== | ||
| + | |||
| + | |||
| + | Символьная | ||
| + | таких как, | ||
| + | Содержимое | ||
| + | например, | ||
| + | переводит | ||
| + | формате ASCII. | ||
| + | Символьная | ||
| + | котоpой указывается более двух символов в нормальной последовательности | ||
| + | представляет единственно | ||
| + | символьных данных. | ||
| + | |||
| + | ==== Числовые константы ==== | ||
| + | Числовые | ||
| + | величин и для aдресов памяти. Для описания константы кавычки | ||
| + | не ставятся. | ||
| + | шестнадцитеричные и записывает | ||
| + | обратной | ||
| + | различные числовые форматы. | ||
| + | === Десятичный формат === | ||
| + | Десятичный формат допускает десятичные | ||
| + | цифры от 0 до 9 и обозначается последней буквой D, которую | ||
| + | можно не указывать, | ||
| + | что | ||
| + | он преобразует | ||
| + | Например, | ||
| + | |||
| + | === Шестнадцатиричный | ||
| + | Шестнадцатиричный формат допускает шест. | ||
| + | цифры от 0 до F и обозначается последней буквой H. Так как | ||
| + | ассемблер полагает, | ||
| + | то первой цифрой шест. | ||
| + | 9. Например, | ||
| + | соответственно в 2E и FF0F (байты во втором | ||
| + | ваются в объектный код в обратной последовательности). | ||
| + | === Двоичный формат === | ||
| + | Двоичный формат допускает двоичные цифры | ||
| + | 0 и 1 и обозначается последней буквой | ||
| + | обычно используется для более | ||
| + | значений | ||
| + | Десятичное 12, шест. C и двоичное 1100B все генерируют один | ||
| + | и тот же код: | ||
| + | от того, как вы рассматриваете содержимое байта. | ||
| + | |||
| + | === Восмеричный формат === | ||
| + | Восмеричный формат допускает восмеричные цифры от 0 до 7 и обозначается последней буквой Q или O, | ||
| + | например, | ||
| + | весьма редко. | ||
| + | |||
| + | При | ||
| + | помнить, | ||
| + | как DB ' | ||
| + | 3132, а числовая константа, | ||
| + | ==== Директива опеделения байта ==== | ||
| + | Из различных | ||
| + | наиболее полезной является DB (определить | ||
| + | выражение | ||
| + | любой длины, | ||
| + | Числовое выражение в директиве | ||
| + | или более однобайтовых констант. | ||
| + | шест. | ||
| + | байте это 7F, если подразумевается, | ||
| + | |||
| + | ==== Директива определения слова (DW) ==== | ||
| + | Директива DW определяет | ||
| + | одно слово (два байта). Символьное выражение в DW ограничено | ||
| + | двумя символами, | ||
| + | коде | ||
| + | определения символьных строк директива DW имеет ограниченное | ||
| + | применение. | ||
| + | Числовое выражение в DW может содержать | ||
| + | двухбайтовых | ||
| + | шест. | ||
| + | байтах | ||
| + | представляют отрицательные значения. В десятичном исчислении | ||
| + | эти пределы выражаются числами +32767 и -32768. | ||
| + | Для форматов директив DW, DD и DQ ассемблер преобразует | ||
| + | константы | ||
| + | обратной | ||
| + | значение 12345 преобразуется в шест.3039, | ||
| + | объектном коде как 3930. | ||
| + | |||
| + | ==== Директива определения двойного слова (DD) ==== | ||
| + | Директива DD определяет | ||
| + | два | ||
| + | содержать одну или | ||
| + | максимум | ||
| + | положительное шест. число в четырех байтых это 7FFFFFFF; все | ||
| + | " | ||
| + | отрицательные значения. | ||
| + | выражаются числами +2147483647 и -2147483648. | ||
| + | Ассемблер преобразует все числовые | ||
| + | DD в шест. | ||
| + | обратной | ||
| + | значение | ||
| + | записывается в oбъектном коде как 39300000. | ||
| + | |||
| + | |||
| + | ==== Директива определения учетверённого слова (DQ) ==== | ||
| + | Директива DQ определяет | ||
| + | слова (восемь байт). Числовое выражение может содержать одну | ||
| + | или | ||
| + | восемь байт или 16 шест.цифр. Наибольшее положительное шест. | ||
| + | число - это семерка и 15 цифр F. Для получения представления | ||
| + | о величине | ||
| + | эквивалентен следующему десятичному числу: | ||
| + | |||
| + | 1152921504606846976 | ||
| + | Ассемблер преобразует | ||
| + | объектный код в обратной последовательности, | ||
| + | тивах DD и DW. | ||
| + | Обработка ассемблером | ||
| + | aналогично директивам DD и DW. | ||
| + | |||
| + | ==== Директива определения десяти байт (DT)==== | ||
| + | Директива DT определяет элементы данных, | ||
| + | десять | ||
| + | " | ||
| + | По директиве | ||
| + | зависимости | ||
| + | |||
| + | ==== Непосредственные операнды ==== | ||
| + | Команда | ||
| + | |||
| + | MOV | ||
| + | |||
| + | пересылает | ||
| + | AX. Трехбайтный объектный код для этой команды есть B82301, | ||
| + | где B8 обозначает | ||
| + | регистр AX", | ||
| + | Многие команды имеют два операнда: | ||
| + | или адрес памяти, | ||
| + | Использование | ||
| + | но, чем oпределение числовой константы в сегменте | ||
| + | организация cсылки на нее в операнде команды MOV, например, | ||
| + | |||
| + | Сегмент данных: | ||
| + | Сегмент кодов: | ||
| + | |||
| + | ==== Длина непосредственных операндов ==== | ||
| + | |||
| + | Длина непосредственной константы зависит от длины первого | ||
| + | операнда. | ||
| + | является двухбайтовым, | ||
| + | |||
| + | MOV AL, | ||
| + | |||
| + | однако, | ||
| + | операнд, | ||
| + | |||
| + | ADD AX, | ||
| + | |||
| + | то ассемблер | ||
| + | байт, 0025 и записывает объектный код в виде 2500. | ||
| + | |||
| + | ==== Непосредственные форматы ==== | ||
| + | |||
| + | Непосредственная константа | ||
| + | напpимер, | ||
| + | ассемблер | ||
| + | например, | ||
| + | Ниже | ||
| + | непосредственные операнды: | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | ==== Директива EQU ==== | ||
| + | Директива EQU не определяет элемент данных, | ||
| + | значение, | ||
| + | других | ||
| + | закодирована следующая директива EQU: | ||
| + | |||
| + | TIMES | ||
| + | |||
| + | Имя, | ||
| + | допустимым в ассемблере | ||
| + | или | ||
| + | подставит | ||
| + | директиву | ||
| + | |||
| + | FIELDA | ||
| + | в | ||
| + | FIELDA | ||
| + | |||
| + | Имя, связанное с некоторым значением с помощью директивы | ||
| + | EQU, может использоваться в командах, | ||
| + | |||
| + | COUNTR | ||
| + | |||
| + | |||
| + | ... | ||
| + | MOV CX,COUNTR | ||
| + | |||
| + | Ассемблер заменяет имя COUNTR | ||
| + | 05, cоздавая операнд с непосредственным значением, | ||
| + | бы было закодировано | ||
| + | |||
| + | MOV CX,05 ; | ||
| + | |||
| + | Здесь приемущество директивы EQU заключается | ||
| + | многие команды могут использовать | ||
| + | имени | ||
| + | изменению подлежит | ||
| + | что | ||
| + | подстановка имеет | ||
| + | можно использовать символические имена: | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | Первый пример предполагает, | ||
| + | опpеделено | ||
| + | операнд TP, ассемблер заменит его на адрес TOTALPAY. Второй | ||
| + | пример | ||
| + | слова MPY вместо обычного мнемокода MUL. | ||
| + | |||
| + | ===== Работа с файлами в MS-DOS ===== | ||
| + | |||
| + | ==== Функции типа дескриптора ==== | ||
| + | |||
| + | В MS-DOS начиная со второй версии файловая система стала иерархической, | ||
| + | C: | ||
| + | Специфика MS-DOS такова, | ||
| + | | ||
| + | преобразуется в | ||
| + | 43 3a 5c 53 59 53 54 45 4d 5c 43 4f 4d 4d 41 4e 44 2e 43 4f 4d 00 | ||
| + | Для работы с файлом с помощью функции типа дескриптора, | ||
| + | jc error | ||
| + | где error - указатель на начало обработчика. | ||
| + | Теперь рассмотрим некоторые функции типа дескриптора, | ||
| + | === Создание файла === | ||
| + | По заданному в коде ASCIIZ пути создаёт новый файл на указанном или текущем диске или на указанном или текущем каталоге. Если указанный файл существует, | ||
| + | При вызове: | ||
| + | * AH = 3cH | ||
| + | * CX = атрибут (в нашем случае всегда 0) | ||
| + | * DS:DX - адрес строки, | ||
| + | При возврате: | ||
| + | Успешно - флаг переноса сброшен | ||
| + | * AX = дескриптор | ||
| + | Неудачно - флаг переноса установлен | ||
| + | * AX = код ошибки | ||
| + | === Открытие файла === | ||
| + | По заданному в коде ASCIIZ пути открывает файл на указанном или текущем диске или на указанном или текущем каталоге. Возвращается дескриптор. | ||
| + | При вызове: | ||
| + | * AH = 3dH | ||
| + | * AL = режим доступа | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | * 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 = код ошибки | ||