мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
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 = код ошибки |