1 Пильщиков В.Н. Программирование на языке ассемблера IBM PC.- М.:"Диалог- МИФИ",2005-2010,-288c. Юров В., Хорошенко С. ASSEMBLER. Учебный курс. – Спб.,

Презентация:



Advertisements
Похожие презентации
Архитектура ЭВМ Практика 3. Линейные программы на языке ассемблера.
Advertisements

Архитектура ЭВМ Практика 4. Программы с ветвлениями.
Организация циклов в Ассемблере. Цикл – это многократно повторяющаяся последовательность операторов.
Определение констант для размещения их компилятором в составе инструкций языка Определение числовых констант: имя = значение PI= V_size = 5 M_size.
Урок 2. Информационные процессы в обществе и природе.
Программирование на Ассемблер к.т.н., доц. Красов А.В. Лекция 2 ФакультетМТС Курс3 Семестр6 Форма контролязачет Лекции14 часов Лабораторные работы12 часов.
Масштаб 1 : Приложение 1 к решению Совета депутатов города Новосибирска от _____________ ______.
Масштаб 1 : Приложение 1 к решению Совета депутатов города Новосибирска от
Язык ASSEMBLER Команды пересылки данных Лекция доцента кафедры ИВТ ГрГУ кандидата технических наук Ливак Е.Н.
Архитектура ЭВМ Практика 2. Основы ассемблера..
Микропроцессоры и микропроцессорные системы. 1. Пересылка данных MOV приемник, источник- Пересылка данных Базовая команда пересылки данных. Копирует содержимое.
Директивы сегментации. Упрощенные директивы сегментации. Лекция доцента кафедры ИВТ ГрГУ кандидата технических наук Ливак Е.Н.
Регистры общего назначения – сумматор, регистр данных, адресный регистр и т.д. Арифметико- логическое устройство Устройство управления
Циклы в языке Ассемблер.. Цикл со счетчиком Цикл со счетчиком можно организовать с помощью конструкций IF и GOTO. В нашем примере тело цикла должно повторяться.
Строковые операции Программирование на ассемблере.
Программирование на Ассемблер к.т.н., доц. Красов А.В. Лекция 1 ФакультетМТС Курс3 Семестр6 Форма контролязачет Лекции14 часов Лабораторные работы12 часов.
Числа со знаком и дополнительный код Синтаксис FASM Для записи отрицательного числа в программе на ассемблере используется символ -, например: x db -5.
Кодирование текстовой информации. Содержание Вопросы для повторения Двоичное кодирование текстовой информации в компьютере Кодовая таблица Код ASCII Принцип.
С ИСТЕМА КОМАНД ЕОМ. С ТРУКТУРА ТА ФОРМАТИ КОМАНД.
Программирование на языке низкого уровня Ассемблер.
Транксрипт:

1 Пильщиков В.Н. Программирование на языке ассемблера IBM PC.- М.:"Диалог- МИФИ", ,-288c. Юров В., Хорошенко С. ASSEMBLER. Учебный курс. – Спб., Питер, 1999 Зубков С.В. Ассемблер для DOS, Windows, UNIX.,- М. ДМК, 2004 Джордейн Р. Справочник программиста персонального компьютера фирмы IBM. M., Сван Т. Освоение Turbo Assembler. - Киев: Диалектика, с. Интернет: emanual.ru, © Варфоломеев В.А. МИИТ, Кафедра АСУ г.

Системы счисления 2 Использование двоичной и шестнадцатеричной систем счисления dbh A B C D E F d= b=96h Результат: b / 2 = / 2 = / 2 = / 2 = 9 9 / 2 = 4 4 / 2 = 2 2 / 2 = 1 1 / 2 = 0 Остаток 150d b Результат: 96h / 16 = 9 9 / 16 = 0 Остаток 150d h Результат: 96h b h h d 9* *16 0 =150 Результат: 150d =150 Результат: 150d b d

Системы счисления 3 Контрольное тестирование 1 1 Какое двоичное число следует за числом 11011b 2 Какое двоичное число предшествует числу b 3 Какое шестнадцатеричное число следует за числом 1999h 4 Какое шестнадцатеричное число следует за числом 9Fh 5 Какое шестнадцатеричное число предшествует числуA00h 6 Вычислить в шестнадцатеричном форматеAABh-2 7 Какое максимальное десятичное число можно представить заданным числом бит 15 8 Сколько бит (минимум) потребуется для представления данного числа 17h 9 Сколько байт потребуется для представления данного числа 79Eh 10 Представьте десятичное число в формате b и h99 11 Представьте двоичное число в формате d и h111110b 12 Представьте шестнадцатеричное число в формате d и b5Ah

Архитектура персонального компьютера 4 Основная память Системная шина Внешняя память Микропроцессор Устройства ввода-вывода

Архитектура персонального компьютера 5 История развития микропроцессоров Intel (семейство «х 86») Год выпуска Тип МП Тактовая частота, МГц Разрядность данных Разрядность адреса Макс. объем памяти 1972i Кб 1978i Мб 1982i Мб 1985i Гб i486 Pentium Pentium II Pentium IV > Гб Itanium Pentium IV EM64T >1000 > Еб 16 Eб 2005Pentium D> Еб 2008Core i Еб

Архитектура персонального компьютера 6 Память ПК Служит для размещения кода и данных программ в период выполнения ЭнергоЗАВИСИМА Возможен непосредственный доступ со стороны процессора с помощью команд ( MOV ) Высокая скорость доступа Служит для долговременного хранения программ и данных в виде файлов ЭнергоНЕЗАВИСИМА Возможен опосредованный доступ со стороны процессора через интерфейс ввода-вывода ( IN, OUT ) Низкая скорость доступа Основная память Внешняя память

Архитектура персонального компьютера.7 Основная память БАЙТ A N =64Кб N max = 2 32 =4Гб 2 64 =16Еб AA+1 СЛОВО AA+1A+2 A+3 ДВОЙНОЕ СЛОВО

Архитектура персонального компьютера.8 Сегментированная модель памяти · · ·· · · S S+1 S+D S+M · · ·· · · СЕГМЕНТ · · ·· · · · · ·· · · S – абсолютный адрес сегмента D – смещение ячейки внутри сегмента (эффективный адрес) M – размер сегмента ( 64 Кб для i8086, 4 Гб для i80386 ) A = S +D – абсолютный адрес ячейки внутри сегмента P = S / 10h – позиция сегмента (номер параграфа) P : D – сегментированный адрес ячейки внутри сегмента 48E30h 48Е3h:0027h => 0027h 48E57h + D S=P*10h D A P

Архитектура персонального компьютера.9 Регистры процессора Пользовательские Системные (управления) Вещественные (FPU) и мультимедиа (MMX) Общего назначения Сегментные Указатель команд Регистр флагов

Архитектура персонального компьютера.10 Регистры общего назначения AHAL AX EAX Аккумулятор (EAX, AX,AH,AL) База (EBX, BX,BH,BL) Счетчик (ECX, CX, CH, CL) Данные (EDX, DX, DH,DL) SI ESI Индекс источника (ESI, SI) Индекс приемника (EDI, DI) Указатель базы (EBP, BP) Указатель стека (ESP, SP)

Архитектура персонального компьютера.11 Сегментные регистры Указатель сегмента кода CS Указатель сегмента стека SS Указатель сегмента данных DS Указатель дополнительного сегмента данных ES Указатель дополнительного сегмента данных GS Указатель дополнительного сегмента данных FS CS 15 0

Архитектура персонального компьютера.12 Регистр флагов FLAGS EFLAGS OFDFIFTFSFZF0AF0PF1CF Флаги условий: CF – флаг переноса OF – флаг переполнения ZF – флаг нуля PF – флаг четности SF – флаг знака AF– флаг дополнительного переноса Флаги состояний: TF – флаг трассировки IF – флаг прерывания DF – флаг направления

Архитектура персонального компьютера.13 Регистр указателя команд IP EIP · · ·· · · · · ·· · · СЕГМЕНТ КОДА · · ·· · · · · ·· · · CS:IP (CS:EIP) – адрес размещения в памяти следующей команды CSIP Код команды

Архитектура персонального компьютера.14 Регистры 64-разрядного процессора AHAL AX EAX Регистры общего назначения (64 бита): RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8, R9, …, R15 RAX Сегментные регистры: CS, DS, SS, ES, GS, FS (16 бит) Регистр указателя команд: RIP (64 бита) Регистр флагов: ЕFLAGS (32 бита)

Архитектура персонального компьютера.15 Алгоритм работы процессора Инициализация счетчика команд CS:IP Чтение и анализ кода команды Тип команды Чтение операндов Формирование нового значения CS:IP Переход Линейная Выполнение команды Формирование IP:=IP+Lc · · ·· · · 58 · · ·· · · 9C CSIP 3E3E9A F4 CD573C

Инициализация счетчика команд CS:IP Чтение и анализ кода команды Чтение операндов Тип команд ы Формирование нового значения CS:IP Выполнение команды Формирование IP:=IP+Lc ……… Буфер команды ПРОЦЕССОР CS IP CSIP 38A20 38A21 38A22 38A23 38A24 38A25 38A26 38A27 38A2F 38A30 38A31 38A32 583E9A0326CD0F004A837B583E9A0326CD 0F 00 4A837B Алгоритм работы процессора Переход Линейная

Разработка программ на Ассемблере 17 Этапы разработки программ на Ассемблере Создание (редактирование) текста программы NC, FAR, Word, Notepad Компоновка (редактирование связей) Tlink. exe Отладка Td. exe Ассемблирование Tasm. exe Исходный модуль Обьектный модуль Загрузочный модуль Листинг Выполнение Prg. exe (Prg.com) Prg. asmPrg. lstPrg. objPrg. exe (Prg.com)

Разработка программ на Ассемблере 18 Общий вид программы на Турбо Ассемблере.MODEL модель; используемая модель памяти.STACK N ; сегмент стека (N – размер).DATA; сегмент данных... Описание данных программы....CODE; сегмент кода START:; точка входа в программу... Код программы... END START; конец сегмента кода

Разработка программ на Ассемблере 19 Размещение exe-программы в памяти Сегмент данных служит для размещения переменных программы и адресуется с помощью сегментного регистра DS. Сегмент кода предназначен для размещения машинного кода программы. Ячейки сегмента кода адресуются с помощью пары регистров CS:IP. Сегмент стека служит для временного хранения данных программы при вызове подпрограмм, обработке прерываний и т.п. Сегмент стека адресуется с помощью сегментного регистра SS. Для микропроцессора i8086 размер сегмента не может превышать 64K 45 EF A D FF DS:0 Сегмент данных AB 00 C5 D DD FF 5F 4A B3 CC BB D1 2F E A A4 BD FF ED CS:0 Сегмент кода 23 DD FF 5F 4A B3 CC BB D1 2F E SS:0 Сегмент стека

Представление данных 20 Представление данных в памяти Целые числа без знака 34h AA+1 СЛОВО AA+1A+2A+3 78h56h34h12h ДВОЙНОЕ СЛОВО 12h12h A БАЙТ 12h 0 ÷ (FFFFh) ( FFFFFFFFh ) 0 ÷ 255 (FFh) Формат little-endian

Представление данных 21 Дополнительный код Байт 98d 62h b -98d (256 – 98 = 158d) 9Eh b Cлово -98d (65536 – 98 = 65437) FF9Eh b Х, если Х>=0 доп(Х) = 2 k - |Х|, если Х

Представление данных 22 Целые числа со знаком СЛОВО AA+1A+2A+3 ДВОЙНОЕ СЛОВО ÷ БАЙТ -128 ÷ Знак Мантисса 127d b 7Fh 1d b 01h -1d b FFh -2d b FEh -127d b 9Eh -128d b 80h

Представление данных 23 Двоично-десятичные числа A Неупакованный BCD формат 1936d Упакованный BCD формат 1936d

Представление данных 24 Представление символов Таблица кодировки символов (стандарт ASCII) A A+1 A+2 A+3 A+4 A+5 A+6 50h P E N T I U M 45h 4Eh 54h49h55h4Dh A A+1 A+2 A+3 A+4 A+5 A+6 50h P e n t i u m 65h 6Eh 74h69h75h6Dh A A+1 A+2 A+3 32h h 35h A A+1 A+2 A+3 02h h 05h A A+1 D3h h

Представление данных 25 Представление команд (на примере двухоперандных команд) КОП операнд 1,операнд 2 d – признак результата (1 - в R1, 0 - в R2) w – тип операндов (1 – слово, 0 – байт) w=0w=1R1, R2 AL CL DL BL AH CH DH BH AX CX DX BX SP BP SI DI dR КОП w 11R2 1. Формат регистр – регистр ( 2 байта) 2. Формат регистр – память ( байта) MOV DX,HELLO 3. Формат регистр – непосредственный операнд (3 - 4 байта) MOV BX,5 4. Формат память – непосредственный операнд (4 - 6 байт) MOV [SI],01Ah. MOV AX,BX; = 8BC3h ADD AX,BX; = 03C3h SUB AX,BX; = 2BC3h

Основные элементы языка Ассемблер.26 Основные элементы языка Ассемблер A [B] C ABC или AC АB{C}AB или ABC или ABCC или ABCCC A | B A или B Правила описания Алфавит латинские буквы A – Z, a – z цифры 0 – 9 знаки $ _ & разделители,. [ ] ( ) {} + / * % ! \ = # ^ Лексемы идентификаторы (имена) числа цепочки символов (строки)

Основные элементы языка Ассемблер 27 Основные элементы языка Ассемблер Идентификаторы служебные слова ( AX, EIP, MOV, ADD, END, SEGMENT ); имена ( PRIMER, MASSIV, CYCLE, ). Особенности использования идентификаторов: Может включать латинские буквы, цифры, а также специальные символы $ _ Идентификатор не может начинаться с цифры Длина имени может быть любой, но значащими являются только первые 31 символов Пробелы внутри идентификатора не допустимы Если используется точка в имени, то она может стоять только на первой позиции (.А ) Допускается применение как прописных так и строчных букв ( AX, Ax, ax ).

Основные элементы языка Ассемблер 28 Основные элементы языка Ассемблер Целые числа Десятичные: 15, -3, 123d (пробелы недопустимы); Двоичные: 1011b, 1000B ; Восьмеричные: 127q, 345o (состоят из цифр 0 7); Шестнадцатеричные: 1234h, 0ABCh, 1d8ff7h, ( AF5h – неправильно) Цепочки символов (строки) Любая последовательность символов алфавита языка, заключенная в кавычки … или апострофы …. Дата рождения A + B Assembler X - неправильно

Основные элементы языка Ассемблер.29 Структура программы на языке Ассемблер предложение... предложение Каждое предложение в отдельной строке Длина предложения не более 131 символа Переносы не допускаются Типы предложений Команды; Макрокоманды; Директивы; Комментарии.

Основные элементы языка Ассемблер.30 Команды метка: – служит для переходов на данную команду; мнемокод – служебное слово, указывающее операцию, которую надлежит выполнить ( ADD, SUB, JMP ) операнды – аргументы, над которыми выполняется операция, определенная мнемокодом. В качестве операндов можно использовать числа, цепочки символов, служебные слова, выражения и операторы. комментарий – служит для пояснения действия команды Основные типы операндов 1. Непосредственный - указывается в самой команде в виде числового или символьного значения ( i8, i16, i32 ): MOV AL,5 2. Регистровый - задается через соответствующий регистр микропроцессора ( AL, DS, ESI)(r8, r16, r32, sr): MOV AX,BX 3. Операнд в памяти - в команде указывается имя операнда или адрес ячейки памяти ( m8, m16, m32 ): MOV DX,NAME MOV ES:[DI],118 Операнды могут задаваться явно и неявно: Явный - присутствует в команде в виде имени, значения или выражения; Неявный - не присутствует в команде, но подразумевается. [метка:] мнемокод [операнды] [;комментарий]

Основные элементы языка Ассемблер 31 Прочие типы предложений языка Директивы - предложения, содержащие символическое указание ассемблеру (не преобразуются в машинный код).MODEL SMALL.CODE X DB 17 h ORG 100h Комментарий - предложения, служащие для пояснения текста программы (игнорируются ассемблером) MOV DS, AX ; комментарий COMMENT * многострочный комментарий * Макрокоманды - предложения, которые в процессе ассемблирования замещаются другими предложениями ассемблера. OUT_STR Hello

Определение данных Ассемблера 32 Определение данных Ассемблера Директива : DB – байт, DW – слово (2 байта), DD – двойное слово (4 байта), DF – 6 байт, DP – 6 байт, DQ – 8 байт, DT – 10 байт Операнды: - число; - строка (цепочка символов); - неопределенное значение (?); - повторитель ( DUP); - константа; - константное выражение; - адресное выражение; Имя: интерпретируется как адрес памяти для ссылки на ячейки размещения данных; характеризуется типом (TYPE), т.е. количеством занимаемых ячеек памяти; определяет значение, т.е. данные в памяти (необязательно). [имя] директива операнд {[,операнд]}

Определение данных Ассемблера 33 Директива DB: определение байта.DATA ; сегмент данных X DB ? Y DB 175 ;AFh ZET DB 0Ch SYM DB *;2Ah DB 5 N2 DB –3; FDh T DB TYPE X [имя] DB операнд {[,операнд]} TYPE = 1, диапазон значений: hAFhОСh?2Ah 0 FDh N2 01h T

Определение данных Ассемблера 34 Определение массивов и строк MAS DB 1,2,5,9,0,6 STR DB a, b, c или STR DB abc K DB 1, 1, 1, 1, 1 или K DB 5 DUP (1) сba ?? ?? ?? L DB 5, 3 DUP (0,2 DUP (?)) MASMAS+1MAS+2MAS+3MAS+4MAS+5 BCD DB 1,8,7,3

Определение данных Ассемблера 35 Директива DW: определение слова TYPE = 2, диапазон значений: ??AFh00h34h12h ABC [имя] DW операнд {[,операнд]}.DATA ; сегмент данных A DW ? B DW 175 ;00AFh C DW 1234h N2 DW –3; FFFDh TYP DW TYPE A FDhFDhFFh N2 02h00h TYP

Определение данных Ассемблера 36 Директива DD: определение двойного слова TYPE = 4, диапазон значений: ???56h34h12h00h? AB [имя] DD операнд {[,операнд]}.DATA ; сегмент данных A DD ? B DD h TYP DD TYPE A 04h00h TYP

Определение данных Ассемблера 37 Константы. Директива эквивалентности все вхождения имени константы в программе ассемблер заменяет на значение операнда; памяти для размещения константы не выделяется имя EQU операнд (имя := операнд) К = А DB К... MOV AX,K PLUS EQU +... P DB PLUS N EQU X DB N DUP (?) REZ EQU X*(Y+2)... ADD AX,REZ имя = операнд Директива присваивания

Определение данных Ассемблера 38 Выражения арифметические операторы: +, -, *, / - сложение, вычитание, умножение, деление; MOD – остаток от деления; ( ) – порядок действий; логические операторы: NOT (нет), AND (и), OR (или), XOR (исключающее или), SHL, SHR (сдвиг); EQ, NE, LT, LE, GT, GE – логические условия; прочие операторы: :, [], PTR, OFFSET, SEG, TYPE, HIGH, LOW, SHORT, LENGTH, SIZE и др. Операторы Выражением называется синтаксическая конструкция, которая содержит числа, имена констант и переменных, а также операторы, определяющие действия над элементами выражений. Z DB (3*Y+X)/2-486 MOV AX,OFFSET MAS MOV AL,BYTE PTR [DI]+1 Выражения вычисляются во время ассемблирования, поэтому не могут включать величины, хранящиеся в регистрах или в памяти.

Определение данных Ассемблера 39 Константные выражения t_size EQU 80 e_size EQU 2... MOV CX, t_size/e_size ;CX = 40 включают числа, константы и символы значение константного выражения есть целое число X DW 5*8-24 ;X= 16 K EQU 3 ;К = 3 Y DB (3*K-1)/2 DUP(?) ;Y = ?,?,?,?

Определение данных Ассемблера 40 Адресные выражения.DATA X DB 1,2,3,4,5 Y DW 6... MOV AL,X+3 ;AL:= 4 MOV BL,X+5 ;BL:= 6 MOV CX,Y-1 ;CX:= 0605h Х Х+1Х+2 Х+3Х+4Y 8??? AХ Х+1 Х $ включают числа, метки, имена переменных, а также счетчик размещения $ значением адресного выражения является 16-и битовое или 32-х битовое целое число, интерпретируемое как адрес..DATA A DB 8 X DB 40 DUP(?) SIZE_X EQU ($-X)/TYPE X

Команды пересылки 41 Использование оператора PTR MOV [BX],28h ; ? ;Неизвестно сколько ячеек памяти нужно использовать: (2,4,8) ? MOV [BX],BYTE PTR 28h ; пересылка одного байта по адресу (BX) MOV BYTE PTR [BX],28h ; то же MOV [BX],WORD PTR 28h ; пересылка слова по адресу (BX) BYTE PTR WORD PTR DWORD PTR Z DD h MOV BYTE PTR Z,0 MOV BYTE PTR Z+1,0 MOV WORD PTR Z,3456h 5634 Z

Определение данных Ассемблера 42 Контрольное тестирование 2 11 A1A1. DATA A1 DB 17 A2 DW 2 DUP (0AE5h) A3 DB –1,-3,10B,? A4 DW 15D,0,-2,TYPE A1 N EQU ($-A4)/TYPE A4 A5 DB LEO A6 DD H A7 DW A5 A8 DB N DUP(252) E5 A2 0AE5 A3 0AFFFD02??0F00 FEFF01004C4F A4A4A5 1. Покажите, как представлена каждая переменная в памяти побайтно (в hex) 2. Чему равно значение объявленных констант? 3. Сколько байт памяти и какие значения адресуют c я с помощью следующих выражений: A2, A3-2, A3+2, A4+3, A7-2, A7, A8[2] A6A A7 1100FC A8A FC A3+2A3-2A2 A7 A4+3 A7-2A8[2] N=(17-9)/2=4 Адресуемые значения: 0AE5h, E5h, 2, FE00h, 12h, 11h, FCh

Команды языка Ассемблер 43 Основные команды языка Ассемблер Команды языка Ассемблер Пере- сылки Арифме- тические Логи – ческие Передачи управления Цепо- чечные Управление ЦП Общего назначе- ния Специа- льные Двоичной арифметики Десятичной арифметики Преобразова- ние типов Побитные Сдвига Безусловного перехода Условного перехода Организации циклов Обработки символов и строковых данных Флагами Системными регистрами Перехода с возвратом

Команды языка Ассемблера 44 Команды пересылки Общего назначения MOV, XCHG Команды чтения / записи в стек POP, PUSH Команды для ввода / вывода IN, OUT Команда для пересылки адресов LEA, LDS, LES, …

Команды пересылки 45 Команда пересылки MOV Ограничения по использованию операндов: Операнды должны быть согласованы по размеру (типу): 8,16,32; Нельзя пересылать из памяти в память; Приемник не может быть непосредственным операндом и регистром CS; Нельзя пересылать из сегментного регистра в сегментный; Нельзя пересылать непосредственный операнд в сегментный регистр; Нельзя пересылать из памяти в сегментный регистр; MOV приемник,источник (приемник := источник) MOV AL,8 ; регистр :=непосредственный операнд MOV DS,AX ; регистр := регистр MOV AX,MEM+1 ; регистр := память MOV MEM,DX ; память := регистр ;Недопустимые команды: MOV DS,8 ; запись в сегм.регистр непоср. значения MOV CH,283; (СH)

Команды пересылки 46 Методы адресации (способы задания операндов в памяти) MOV AX,MAS[BX] ; AX:=(DS:MAS+(BX)) MOV AX,[BX+2] ; AX:=(DS:(BX)+2) MOV AX,[BX]+2 ; AX:=(DS:(BX)+2) Прямая адресация MOV AX,MEM ;AX:=(DS:MEM) ()- содержимое памяти или регистра ;смещение - по размещению MEM в сегменте данных MOV AX,ES:MEM ;сегментная часть адреса определена явно Абсолютная адресация MOV AX,ES:0005 ;AX:=(ES:0005) Косвенная базовая адресация MOV AX,[BX] ;AX:=(DS:(BX)) ;содержимое BX интерпретируется как адрес памяти ;в i8086 для базирования используют BX,SI,DI,BP Косвенная базовая адресация со смещением

Команды пересылки 47 Методы адресации (способы задания операндов в памяти) Косвенная базовая индексная адресация MOV AX,[BX][SI] ;AX:=(DS:(BX)+(SI)) MOV AX,MAS[BX][SI] ;AX:=(DS:MAS+(BX)+(SI)) ;BX–база, SI–индекс ;Допустимые регистры: ;Для i8086: (BX, SI), (BX, DI), (BP,SI), (BP,DI) ;Для i386: любые РОН Косвенная базовая индексная адресация со смещением Косвенная адресация с масштабированием MOV AX,MAS[ESI*2] ;AX:=(DS:MAS+(ESI)*2) MOV AX,MAS[BX][SI]+2 ; AX:=(DS:MAS+(BX)+(SI)+2) MOV AX,MAS[BX][SI+2] ; AX:=(DS:MAS+(BX)+(SI)+2)

Команды пересылки 48 Команда обмена значениями XCHG XCHG операнд 1,операнд 2 B:= операнд 1 операнд 1:= операнд 2 операнд 2:= B Операнды должны быть согласованы по размеру (типу): 8,16,32 Оба операнда не могут быть ячейками памяти одновременно Исключается использование непосредственных операндов XCHG AX,BX XCHG CX,MEM Пересылает эффективный адрес переменной (смещение в сегменте данных) в регистр (r16) Команда загрузки адреса LEA LEA операнд 1,операнд 2 операнд 1:= Адрес(операнд 2) MAS DB 10 dup (0)... LEA BX,MAS ; в регистр BX записываем адрес переменной MAS MOV DH,MAS ; в регистр DH записываем содержимое ячейки памяти

Арифметические команды 49 Арифметические команды Команды двоичной арифметики ADD, SUB, MUL, IMUL, DIV, IDIV, INC, DEC, NEG Команды десятичной арифметики AAA, AAS, AAM, AAD, … Команды преобразования типов данных CBW, CWD, …

Арифметические команды 50 Команда сложения ADD Операнды должны быть согласованы по типу (8, 16, 32) Операнды одновременно не могут быть ячейками памяти Приемник не может быть непосредственным операндом ADD приемник,источник приемник:=приемник+источник ADD AX,BX ; AX:=AX+BX ADD MEM,28h ; MEM:=MEM+28h ADD CX,BUFF ; CX:=CX+BUFF Устанавливаемые флаги: ZF, SF, CF, OF, AF, PF Флаг переноса CF устанавливается, если есть перенос из старшего разряда Флаг переполнения OF устанавливается, если имеет место только один из двух переносов: из знакового (старшего) разряда либо в знаковый (старший) разряд Флаг нуля ZF устанавливается, если результат равен нулю Флаг знака SF устанавливается, если знаковый (старший) бит результата равен 1 MOV AL,1 ; ADD AL,-1 ; = ; CF=1,OF=0,ZF=1,SF=

Арифметические команды 51 Сложение беззнаковых чисел MOV AL,254 ADD AL,5 ; AL = 259 – 256 = 3, CF=1 Если результат сложения превосходит по размеру приемник, то из полученного результата будет вычтено 2 k и этот результат будет записан в приемник ( k - разрядность приемника) Признаком правильности результата сложения беззнаковых чисел является значения флага переноса CF=0 (CF=1 – ошибка) Х+Y, если Х+Y=2 k, CF=1 CF

Арифметические команды 52 Сложение чисел со знаком Сложение чисел со знаком и без знака производится по одному алгоритму! Отрицательные числа представляются в дополнительном коде Признаком правильности результата сложения чисел со знаком является значения флага переполнения OF (OF=1 – ошибка) (-1)=2 CF=1, OF= =-2 CF=0, OF= = -127 ? CF=0, OF= (-1)=127 ? CF=1, OF=1 Результат правильный Результат неправильный ++++

Арифметические команды 53 Команда вычитания SUB SUB AX,17 ; АХ :=АХ - 17 SUB MEM,BX ; МЕМ:=МЕМ – ВХ SUB BUFF,24513 ; BUFF:=BUFF SUB приемник,источник приемник:=приемник-источник Устанавливаемые флаги: ZF, SF, CF, OF, AF, PF Флаг переноса CF устанавливается, если при вычислении старшего разряда результата был выполнен заем (т.е. если приемник меньше источника) Флаг переполнения OF устанавливается, если имеет место только один из двух заемов: из знакового (старшего) разряда либо в знаковый (старший) разряд (т.е. если вычитаются числа разных знаков и результат находится вне диапазона представления знаковых чисел)

Арифметические команды 54 Вычитание беззнаковых и знаковых чисел Вычитание знаковых и беззнаковых чисел производится по общему алгоритму: если приемник меньше источника, то к приемнику приписывается еще один единичный разряд слева (добавляется 2 k ) и из полученного значения вычитается источник (k - разрядность приемника) Признаком правильности результата вычитания беззнаковых чисел является значения флага переноса CF (CF=1 – ошибка) Признаком правильности результата вычитания знаковых чисел является значения флага переполнения OF (OF=1 – ошибка) Х-Y, если Х>=Y, CF=0 разность(Х,Y) = (2 k +X)-Y, если Х

Арифметические команды 55 Команды инкремента и декремента INC, DEC INC AX ; AX := AX + 1 INC MEM ; MEM := MEM + 1 DEC AX ; AX := AX - 1 DEC MEM ; MEM := MEM – 1 INC операнд операнд:=операнд+1 DEC операнд операнд:=операнд-1 Устанавливаемые флаги: OF, ZF (CF – не изменяется) Инкремент Декремент

Арифметические команды 56 Команда инверсии знака NEG MOV AH,1 ; b NEG AH ; b = -1d NEG операнд операнд:= -операнд Устанавливаемые флаги: если операнд =0, то CF = 0 ; если операнд 0, то CF = 1; если операнд = -128 или –32768, то OF = 1.

Арифметические команды 57 Команды умножения MUL, IMUL Тип операнда (1-й множитель) 2 –й множи- тель Произведение Максимальное значение произведения Граница для установки флагов СF и OF r8,m8 r16,m16 r32,m32 AL AX EAX AX:=операнд*AL (DX,AX):= операнд*AX (EDX,EAX):= операнд*EAX ,45* ;ПРИМЕР 1: 100*2 = ? MOV AL,100 MOV BL,2 MUL BL ; AX:=AL*BL (100*2= ) CF=OF=1 ;ПРИМЕР 3: 300*3 = ? MOV AX,300 MOV BX,3 MUL BX ; (DX,AX):= AX*BX (300*3=900

Арифметические команды 58 Команды деления DIV, IDIV Флаги не устанавливаются Если операнд равен 0, или частное не умещается в соответствующем регистре, формируется прерывание (исключение) Делимое Делитель (операнд) Частное Остаток AX (DX,AX) (EDX,EAX) r8,m8 r16,m16 r32,m32 AL:=AX/операнд AX:=(DX,AX)/операнд EAX:=(EDX,EAX)/операнд AH DX EDX DIV операнд (для беззнаковых чисел) IDIV операнд (для чисел со знаком) MOV AX,301 MOV BL,2 DIV BL ;AX/BL => AL=150, AH=1 ; MOV AX,601 DIV BL ;AX/BL >255 => прерывание divide overflow error ; MOV AX,601 MOV DX,0 MOV BX,2 DIV BX ;(DX,AX)/BX => AX=300, DX=1

Арифметические команды 59 Команды преобразования типов данных CBW, CWD MOV AL,5 ; b = 05h CBW ; AX:= b = 0005h MOV AL,-5 ; b = 0FBh CBW ; AX:= b = 0FFFBh ; MOV AL,17 ; первое слагаемое – байт MOV BX,1073 ; второе слагаемое – слово CBW ; преобразование байта в слово ADDBX,AX ; осуществляем сложение CBW AL=>AX Преобразование байта в слово MOV AX,25 ; слово MOV BX,4 ; слово CWD ; преобразование слова АХ в два слова (DX,AX) DIV BX ; делим (DX,AX)/BX Преобразование слова в двойное слово CWD AX=>(DX,AX) Если в AL беззнаковое число, то вместо CBW следует использовать MOV AH,0 !!!

Команды передачи управления 60 Команды передачи управления Команда безусловного перехода JMP Команды условного перехода JE, JNE, JG, JGE, JL, JLE, JA, JAE, JB, JBE JZ, JNZ, JC, JNC, JO, JNO, JS, JNS, JP, JNP JCXZ, JCXNZ Команды организации циклов LOOP, LOOPE, LOOPNE Команды перехода с возвратом CALL, RET, INT, IRET

Команды передачи управления 61 Переходы и метки Метка характеризуется: 1) сегментом кода, в котором она описана; 2) смещением от начала сегмента кода; 3) атрибутом NEAR или FAR (ближний и дальний тип метки) Команды перехода изменяют содержимое пары регистров CS:IP в соответствии со значением, определяемым операндом метка КОП метка …………… JMP M1 …………… M1: …………… JMP FAR M2 Сегмент 1 …………… M2 LABEL FAR …………… JMP M3 …………… M3: Сегмент 2 NEAR FAR Типы переходов NEAR – переход в пределах сегмента (изменяет только регистр IP ): SHORT – короткий переход ( в пределах: б) LONG – длинный переход ( в пределах: б) FAR – межсегментный переход (изменяет регистры IP и CS )

Команды передачи управления 62 Безусловный переход JMP FAR PTR M1.... M1 LABEL FAR MOV AX, BX JMP [SHORT] адрес (IP:=offset адрес) JMP FAR PTR адрес (CS:=seg адрес, IP:=offset адрес) JMP M1... M1: MOV AX,BX... JMP M1 JMP SHORT M1... M1: MOV AX,BX а) Прямой длинный переход вперед Ближний ( NEAR) переход б) Прямой короткий переход вперед в) Прямой переход назад г) Косвенный переход M1: MOV AX,BX... LEA DX,M1 JMP DX Дальний ( FAR) переход

Команды передачи управления 63 Команда сравнения Jxx адрес (IF условие xx THEN GOTO адрес) CMP операнд 1,операнд 2 (операнд 1-операнд 2 -> флаги) Переход по результату сравнения двух чисел (например по команде CMP ) Переход по результату проверки состояния флагов Переход по содержимому регистра CX(ECX) Тип перехода для i8086 near short, для i386: near long, near short Условный переход Флаги формируются так же, как и у команды вычитания SUB

Команды передачи управления 64 Переход по результату сравнения двух чисел ;вычислить Z = max(x,y) ;X,Y,Z – числа со знаком типа byte MOV AL,X ;AL:=X CMP AL,Y ;X – Y = ? JGE M ;перейти к метке М, если X >= Y MOV AL,Y ;выполнить AL:=Y, если X < Y M : MOV Z,AL ;Z:=AL Команда переходаCMP Oп 1,Оп 2Типы операндов Флаги JE JNE Оп 1 = Оп 2 Оп 1 Оп 2 любые ZF = 1 ZF = 0 JL (JNGE) JLE (JNG) JG (JNLE) JGE (JNL) Оп 1 < Оп 2 Оп 1 Оп 2 Оп 1 > Оп 2 Оп 1 Оп 2 со знаком SF OF SF OF или ZF =1 SF = OF и ZF = 1 SF = OF JB (JNAE) JBE (JNA) JA(JNBE) JAE (JNB) Оп 1 < Оп 2 Оп 1 Оп 2 Оп 1 > Оп 2 Оп 1 Оп 2 без знака CF = 1 CF = 1 или ZF =1 CF = 0 и ZF = 0 CF =OF

Команды передачи управления 65 Переход по результату сравнения двух чисел (2) ;вычислить Z = max(x,y) X DB b Y DB 0 Z DB ?... MOV AL,X CMP AL,Y JGE M MOV AL,Y M : MOV Z,AL ;вычислить Z = max(x,y) X DB b Y DB 0 Z DB ?... MOV AL,X CMP AL,Y JAE M MOV AL,Y M : MOV Z,AL Z=

Команды передачи управления 66 Переход по результату проверки флагов ;C:=A*A+B (A,B,C-байты б/з) MOV AL,A MUL AL JC ERROR ;если A*A>255 ADD AL,B JC ERROR ;если A*A+B>255 MOV C,AL... ERROR: Переход по содержимому регистра СХ (ЕСХ) Команда перехода Условие перехода Команда перехода Условие перехода JZ JS JC JO JP ZF=1 SF=1 CF=1 OF=1 PF=1 JNZ JNS JNC JNO JNP ZF=0 SF=0 CF=0 OF=0 PF=0 Команда перехода Условие перехода Команда перехода Условие перехода JCXZCX=0JCXNZCX0

Команды передачи управления 67 Примеры организации ветвления программ CMP X,0 JLE M JMP FIN M: FIN:... BEG: CMP X,0 JLE FIN JMP BEG FIN:... BEG: CMP X,0 JG BEG... if X > 0 then else while X > 0 do repeat until X > 0 Преодоление ограничения на длину безусловного перехода (для i8086) CMP X,Y JG XGY MOV AX,DX... XGY:... >127 б Relative jump out of range! CMP X,Y JLE XLEY JMP XGY XLEY: MOV AX,DX... XGY:...

Команды передачи управления 68 Счетные циклы MOV CX,N CONT: DEC CX ;CX:=CX-1 CMP CX,0 JNE CONT MOV CX,N CONT: LOOP CONT ; CX:=CX–1 ; IF CX 0 THEN GOTO CONT ;Пример: Вычислить факториал N! MOV AX,1 ;начальное значение N! MOV CX,N ;счетчик цикла = N JCXZ FIN ;проверим CX (рекомендуется!) MOV SI,1 ;SI=1 F: MUL SI ;(DX,AX:=AX*SI) INC SI ;SI:=SI+1 LOOP F ;повторять, пока CX 0 FIN:... LOOP метка (FOR I:=1 TO N do...) В качестве счетчика цикла используется только регистр CX ; Тело цикла будет выполнено хотя бы один раз; Для i8086 LOOP использует только короткий переход;

Команды передачи управления 69 Счетные циклы с условием LOOPE (LOOPZ) метка «Повторяй, пока 0» LOOPNE (LOOPNZ) метка «Повторяй, пока не 0» CX:=CX-1 IF (CX 0) AND (ZF=1) THEN GOTO метка CX:=CX-1 IF (CX 0) AND (ZF=0) THEN GOTO метка ;ПРИМЕР Найти наименьшее число последовательности [2,K], ;на которое не делится число N (K,N – байтовые переменные) MOV DL,N MOV DH,0 ; DX:=N MOV CL,K MOV CH,0 DEC CX ; CX:=K-1(счетчик цикла) MOV BL,1 DV: INC BL ; очередное число из диапазона [2,K] MOV AX,DX DIV BL ; AH:=N mod BL (берем остаток) CMP AH,0 ; остаток=0? LOOPE DV ; цикл CX раз пока остаток=0 JNE DV1 ; остаток 0 выход из программы MOV BL,0 ; нет искомого числа (запишем 0) DV1:...

Обработка массивов 70 Обработка одномерных массивов MAS DB 1,0,-3,5,17... MOV AH,MAS+3 ;AH:=5 прямая адресация MOV BX,3 MOV AL,MAS[BX] ;AL:=5 косвенная адресация ;Суммирование элементов массива байтов MOV AL,0 MOV CX,5 MOV SI,0 NEXT: ADD AL,MAS[SI] ADD SI,1 LOOP NEXT MAS DB 1,0,-3,5,17... MOV AH,MAS+3 ;AH:=5 прямая адресация MOV BX,3 MOV AL,MAS[BX] ;AL:=5 косвенная адресация ;Суммирование элементов массива байтов MOV AL,0 MOV CX,5 MOV SI,0 NEXT: ADD AL,MAS[SI] ADD SI,1 LOOP NEXT В качестве индексных регистров разрешается использовать BX, SI, DI (для i8086) MAS2 DW 5,8,1,-2... MOV AX,MAS2+4 ;AX:=1 MOV BX,4 MOV AX,MAS2[BX] ;AX:=1 ;Суммирование элементов массива слов MOV AX,0 MOV CX,4 MOV SI,0 NEXT: ADD AX,MAS2[SI] ADD SI,2 LOOP NEXT MAS2 DW 5,8,1,-2... MOV AX,MAS2+4 ;AX:=1 MOV BX,4 MOV AX,MAS2[BX] ;AX:=1 ;Суммирование элементов массива слов MOV AX,0 MOV CX,4 MOV SI,0 NEXT: ADD AX,MAS2[SI] ADD SI,2 LOOP NEXT MAS FEFF MAS2 A(i) A+i*t A[BX]

Обработка массивов 71 Обработка двумерных массивов A(i,j) A+i*m*t+j*t AA+1A+2A+3A+4A+5A+6A+7A+8 … … i=0 j=0 i=0 j=1 i=0 j=2 i=1 j=0 i=1 j=1 i=1 j=2 i=2 j=0 i=2 j=1 i=2 j=2 A[BX][SI] A + (BX) + (SI) – адрес выбранного элемента BX := i* m *t – смещение первого элемента i - й строки (i=0,1,…,n) SI := j*t - смещение j - го элемента в текущей строке (j=0,1,…,m) A DB 3,1,2 DB 5,4,6 DB 8,9,7 A – начальный адрес массива; m – количество элементов в строке; n – количество строк; t – тип элемента массива (количество байт, занятых под один элемент). BX=0 BX=3 BX=6 A[BX][SI] A DB 3,1,2,5,4,6,8,9,7 или

Обработка массивов 72 Пример работы с двумерными массивами MAS3 DB 1,2,3,1 DB 3,4,0,2 DB 7,8,9,3 M EQU 4 N EQU 3... ;выбор элемента i=1,j=2 MOV BX,4 ;BX:=i*m*t=1*4*1=4 MOV SI,2 ;SI:=j*t=2*1=2 MOV AH,MAS3[BX][SI] ;AH:=0 (MAS3+4+2 – 6-й эл-т) ;выбор элемента i=i+1,j=1 ADD BX,M*TYPE MAS3 ;BX:=BX+m*t=BX+4=8 MOV SI,1 ;SI:=j*t=1*1=1 MOV AL,MAS3[BX][SI] ;AL:=8 (MAS3+8+1 – 9-й эл-т) MAS

Логические команды 73 Логические команды Команды логических операций AND, OR, XOR, NOT, TEST Команды сдвига SHR, SHL, SAR, SAL, ROR, ROL, … Команды обработки бит BSF, BSR, BT, BTC, BTR, BTS

Логические команды 74 XYX and YX or YX xor Ynot X Команды логических операций AND приемник,источник Логическое умножение (И) TEST приемник,источник OR приемник,источник Логическое сложение (ИЛИ) XOR приемник,источник Исключающее ИЛИ NOT приемник Логическое отрицание (НЕ) Приемник - m8,r8,m16,r16,m32,r32; Источник -m8,r8,i8,m16,r16,i16,m32,r32,i32; Формируют флаги ZF, SF, PF, флаги CF и OF сбрасываются в 0.

Логические команды 75 Применение команд логических операций Проверка значения бита числа Х 7 Х 6 Х 5 Х 4 Х 3 Х 2 Х 1 Х Х 1 0 AND AND X, B ;проверка 1-го бита JZ BIT_0 ;перейти, если бит=0... BIT_0: Установка значения бита числа Х 7 Х 6 Х 5 Х 4 Х 3 Х 2 Х 1 Х Х 7 Х 6 Х 5 Х 4 Х 3 Х 2 1 Х 0 OR OR X, B ;установка 1-го бита в 1 AND X, B ;сброс 1-го бита в 0 Х 7 Х 6 Х 5 Х 4 Х 3 Х 2 Х 1 Х Х 7 Х 6 Х 5 Х 4 Х 3 Х 2 0 Х 0 AND Инвертирование значения бита XOR X, B ;инвертирование 1-го бита Х 7 Х 6 Х 5 Х 4 Х 3 Х 2 Х 1 Х Х 7 Х 6 Х 5 Х 4 Х 3 Х 2 Х 1 Х 0 XOR

Логические команды 76 Команды сдвига SHR операнд,счетчик Логический сдвиг SHL операнд,счетчик Операнд - m8,r8,m16,r16,m32,r32; счетчик - i8,CL; SAR операнд,счетчик Арифметический сдвиг SAL операнд,счетчик ROR операнд,счетчик Циклический сдвиг ROL операнд,счетчик … Операнд CF 0 … Операнд зн CF 0 … Операнд CF … Операнд CF 0 … Операнд CF … Операнд CF MOV AL, B SHL AL,1 ;AL= ,CF=0 SHL AL,1 ;AL= ,CF=1 MOV BH, B SAR BH,1 ;BH= ,CF=0 MOV BH, B SAR BH,1 ;BH= ,CF=0 MOV CL, B ROL CL,1 ;CL= ,CF=1 MOV BL, B ROR BL,1 ;BL= ,CF=0

Логические команды 77 Применение команд сдвига Быстрое умножение на степени 2 ( X*2 k ) MOV AL,5 ;AL= b=5 SHL AL,3 ;AL= b=40=5*2 3, SHL AL,3 ;AL= b=64 40*2 3, результат неверный! Выполняется быстрее, чем умножение с помощью команды MUL Применяется для беззнаковых и знаковых (в дополнительном коде) чисел Дает верный результат, если старшая значащая цифра не выходит за пределы разрядной сетки Быстрое целочисленное деление на степени 2 ( X/2 k ) MOV AL,18 ;AL= b=18 SHR AL,3 ;AL= b=2=18\2 3 MOV BL,-18 ;AL= b SAR BL,2 ;AL= b=-4=-18\2 2 Выполняется быстрее, чем деление с помощью команды DIV Для беззнаковых чисел применяется команда SHR Для знаковых чисел (в дополнительном коде) применяется команда SAR (округляет частное в меньшую сторону!)

Цепочечные команды 78 Цепочечные команды Команды пересылки цепочек MOVSB, MOVSW, MOVSD, MOVS Команды сравнения цепочек CMPSB, CMPSW, CMPSD, CMPS Команды сканирования цепочек SCASB, SCASW, SCASD, SCAS Команды извлечения элемента из цепочки LODSB, LODSW, LODSD, LODS Команды заполнения цепочки STOSB, STOSW, STOSD, STOS Префиксы повторения цепочечных команд REP, REPE, REPZ, REPNE, REPNZ Цепочка – последовательность элементов данных, записанных в памяти (байтов, слов, двойных слов)

Цепочечные команды 79 Обобщенный формат цепочечных команд DF = 0DF = 1 Байт Слово Дв. слово [префикс_повторения] команда Неявные операнды цепочечных команд: Приемник (результирующая цепочка) – адресуется парой регистров ES:DI Источник (исходная цепочка) – адресуется парой регистров DS:SI Направление (последовательность) обработки элементов цепочки: Флаг DF = 0 - обработка вперед (от младших адресов к старшим) – по умолчанию Флаг DF = 1 - обработка назад (от старших адресов к младшим ) CLD (DF=0) STD (DF=1) Автоматическая модификация значений регистров SI и DI

Цепочечные команды 80 Обобщенный формат цепочечных команд Префикс повторения REP – устанавливает повторение цепочечной команды N раз (задается в регистре CX ); REPE (REPNE) – повторение N раз, но пока ZF =0 ( ZF 0). Префикс REP обеспечивает пересылку до 64 Кб для i8086 и до 4 Гб для i 386 Порядок действий при использовании цепочечных команд 1. Установить значение флага DF в зависимости от направления обработки цепочек 2. Загрузить указатели на адреса цепочек в памяти в регистры DS:SI и ES:DI 3. Если количество обрабатываемых элементов больше 1, записать их число в регистр CX 4. Записать цепочечную команду с учетом типа элементов цепочки; если необходимо, использовать префикс повторения REP(REPE,REPNE). REP (CX:=CX-1, повтор, пока CX 0 ) REPE|REPZ (CX:=CX-1, повтор, пока ZF=1 и CX 0 ) REPNE|REPNZ (CX:=CX-1, повтор, пока ZF=0 и CX 0 ) L: if CX = 0 then goto L1 CX:=CX-1 goto L L1: L: if CX = 0 then goto L1 CX:=CX-1 if ZF=1 then goto L L1: L: if CX = 0 then goto L1 CX:=CX-1 if ZF=0 then goto L L1:

Цепочечные команды 81 Команды пересылки цепочек [REP] MOVSB ([ES:DI]:=[DS:SI],DI:=DI±1,SI±1) [REP] MOVSW ([ES:DI]:=[DS:SI],DI:=DI±2,SI±2) [REP] MOVSD ([ES:DI]:=[DS:SI],DI:=DI±4,SI±4) MOVSB – для цепочек байтов; MOVSW – для цепочек слов; MOVSD – для цепочек дв. слов Операнды : DS:SI – адрес цепочки источника, ES:DI – адрес цепочки приемника ???? DS:SI ES:DI MOVSB ;переслать 1 байтMOV CX,5 REP MOVSB ;переслать 5 байт DS:SI ES:DI SI:=SI+1 DI:=DI+1 SI:=SI+5 DI:=DI+5 CX:=0

Цепочечные команды 82 Копирование блоков памяти c помощью MOVS DS:SI ES:DI.DATA STR1 DB МОСКВА ;строка-источник N EQU $-STR1 ;N - длина строки-источника STR2 DB N DUP(?) ;строка-приемник.CODE S: MOV MOV DS,AX MOV ES,AX ;загрузка ES (для адреса приемника) CLD ;устанавливаем флаг DF=0 LEA SI,STR1 ;загрузка индексного регистра источника LEA DI,STR2 ;загрузка индексного регистра приемника MOV CX,N ;загрузка в CX числа элементов цепочки N REP MOVSB ;пересылка N элементов байтовой цепочки END S МО С КВА МО С КВА SI= DI= CX=

Цепочечные команды 83 Команды сравнение цепочек CMPSB – для цепочек байтов; CMPSW – для цепочек слов; CMPSD – для цепочек двойных слов Операнды : DS:SI – адрес цепочки источника, ES:DI – адрес цепочки приемника ;Пример сравнения строк CLD MOV CX,5 LEA SI,STR1 LEA DI,STR2 REPE CMPSB JE EQUAL ;строки различаются... EQUAL:... ;есть совпадение МАРИЯ STR1 МАРТА ZF=1 ZF=1 ZF=1 ZF=0 SI+1 SI+2 SI+3 SI+4 DI+1 DI+2 DI+3 DI+4 STR2 = = = SI, DI указывают на следующий элемент за элементом, давшим несовпадение [REP[N]E] CMPSB ([ES:DI]-[DS:SI]=>флаг ZF DI:=DI±1,SI±1) [REP[N]E] CMPSW ([ES:DI]-[DS:SI]=>флаг ZF DI:=DI±2,SI±2) [REP[N]E] CMPSD ([ES:DI]-[DS:SI]=>флаг ZF DI:=DI±4,SI±4)

Цепочечные команды 84 Команды сканирования цепочек SCASB – для байтовых цепочек; SCASW – для цепочек слов; SCASD – для цепочек дв. слов Операнды : ES:DI – адрес цепочки приемника, AL(AX,EAX)- искомый элемент [REP[N]E] SCASB ([ES:DI]-(AL)=> флаг ZF,DI:=DI±1) [REP[N]E] SCASW ([ES:DI]-(AX)=> флаг ZF,DI:=DI±2) [REP[N]E] SCASD ([ES:DI]-(EAX)=> флаг ZF,DI:=DI±4) ;Найти символ. в тексте и заменить его символом !. STR DB Здравствуй, дорогая, и прощай. L EQU $-STR... MOV AL,. LEA DI,STR ;загрузка DI MOV CX,L ;счетчик повторений CLD ;DF=0 REPNE SCASB ;сравнивать эл-ты строки с содержимым AL до ;тех пор, пока не будет обнаружен первый эл-т, ;совпадающий с символом. JNE FIN ;если не найден д – перейти к FIN MOV BYTE PTR ES:[DI–1],! ; поместить новый символ FIN:...

Цепочечные команды 85 Команды заполнения цепочки STOSB – для байтовой цепочки; STOSW – для цепочки слов; STOSD – для цепочки дв. слов. Операнды : ES:DI – адрес цепочки приемника, AL(AX,EAX)- элемент-источник ;Заполнить область памяти символами * STR DB 32 DUP(?)... LEA DI,STR ;загрузка DI MOV CX,32 ;счетчик повторений CLD ;DF=0 MOV AL,* REP STOSB ;область памяти заполняется символами * [REP] STOSB ([ES:DI]:=(AL),DI:=DI±1) [REP] STOSW ([ES:DI]:=(AX),DI:=DI±2) [REP] STOSD ([ES:DI]:=(EAX),DI:=DI±4)

Цепочечные команды 86 Команды извлечение элементов из цепочки LODSB – для байтовой цепочки; LODSW – для цепочки слов; LODSD – для цепочки дв. слов Операнды : DS:SI – адрес цепочки источника, AL(AX,EAX)- элемент-приемник … AL преобразованиеAL Источник LODSB STOSB Приемник LODSB (AL:=(DS:SI),SI:=SI±1) LODSW (AX:=(DS:SI),SI:=SI±2) LODSD (EAX:=(DS:SI),SI:=SI±4) ;Переписать эл-ты байтового массива X в байтовый массив Y ;с инверсией знака (число элементов 100) CLD ;DF=0 LEA SI,X ;загрузка SI (для команды LODS) LEA DI,Y ;загрузка DI (для команды STOS) MOV CX,100 ;счетчик повторений L: LODSB ;Xi -> AL, SI:=SI+1 NEG AL ;изменение знака STOSB ;AL -> Yi, DI:=DI+1 LOOP L ;повторить 100 раз

Структуры данных 87 Структуры Описание шаблона структуры (список полей данных) STRUC, ENDS Определение экземпляров структуры в сегменте данных (выделение памяти и инициализация) Организация доступа к элементам (полям) структуры. Оператор.

Структуры данных 88 Описание структуры (шаблон) STUD STRUC ;студент FAM DB 12 DUP ( );фамилия NANE DB ;имя SEX DB M ;пол BYEAR DW ? ;год рожд. MARKS DB 4 DUP (?) ;оценки STUD ENDS имя STRUC (директива DB|DW|DD)... (директива DB|DW|DD) имя ENDS DATE STRUC ;дата Y DW 1994 ;год M DB 3 ;месяц D DB ? ;день DATE ENDS

Структуры данных 89 Определение экземпляров структур D1 DATE D2 DATE D3 DATE D1D2D2D3D3 ? ?19943? TYPE DATE =4 ( по количеству байт, зарезервированных в структуре ) TYPE D1 =4, TYPE STUD =28 DATES DATE 100 DUP ; (100 дат) UAI_211 STUD 25 DUP UIS_211 STUD Иванов,Иван,М,1983,3,3,3,3 STUD Петров,Петр, М,1982,4,3,2,5 STUD Сидорова,Анна,Ж,1982,5,4,5,4 L EQU TYPE UIS_211 ; длина строки таблицы имя_переменной имя_структуры [ ] Массивы структур (таблицы)

Структуры данных 90 Доступ к элементам структур Оператор (.) относится к адресным выражениям и обозначает адрес, вычисляемый по формуле: ( + ) Тип адреса совпадает с типом (размером) указанного поля. имя_структуры[±C].имя_поля [регистр][±C].имя_поля D1. Y ; (D1 + 0) D1. D ; (D1 + 3) LEA BX,D2 MOV AX,[BX].Y ;AX:=1998 K EQU TYPE D2. Y ;K=2 байт Косвенная адресация Прямая адресация

Структуры данных 91 ;Подсчитать количество студентов мужского пола.MODEL SMALL STUD STRUC... STUD ENDS.DATA GR STUD Иванов,Иван,М,1983,3,3,3,3 STUD Сидоров,Петр,М,1980,4,4,3,2 STUD Петрова,Маша,Ж,1984,5,4,4,3... LEN EQU TYPE STUD ;длина строки таблицы N EQU($-GR)/LEN ;количество строк в таблице.CODE... MOV AL,0 ;счетчик лиц М MOV CX,N ;счетчик строк в таблице MOV BX,0 ;смещение текущей строки таблицы CYCLE CMP (GR[BX]).SEX,M ;сравнить поле SEX текущей строки сМ JNE NEXT ;если не равно - дальше INC AL ;если равно – AL:=AL+1 NEXT: ADD BX,LEN ;указатель на следующую строку LOOP CYCLE ;продолжить, если CX0 Использование структур: пример 1

Структуры данных 92 Использование структур: пример 2 ;Посчитать количество студентов с именем Иван... NAMEF DB Иван N1 EQU $-NAMEF ;длина NAMEF.CODE MOV MOV DS,AX MOV ES,AX ;регистр ES нужен для цепочечной команды CLD ;направление обработки цепочки (DF=0) MOV AL,0 ;счетчик совпадений с именем Иван MOV CX,N ;счетчик цикла (N-число студентов) LEA BX,GR.NAME ;адрес поля NAME в BX CYCLE: LEA DI,NAMEF ;индекс цепочки-источника (строка NAMEF) MOV SI,BX ;индекс цепочки-приемника (поле GR.NAME) MOV DX,CX ;спасаем CX MOV CX,N1 ;в CX – длина цепочки (4) REPE CMPSB ;сравнивать цепочки, пока равно JNE NEXT ;если не совпали - дальше INC AL ;если совпали -счетчик совпадений AL:=AL+1 NEXT: ADD BX,LEN ;поместить в BX адрес поля NAME след.строки MOV CX,DX ;восстанавливаем счетчик цикла LOOP CYCLE ;продолжить, если CX0

Структуры данных 93 Макросредства Макроопределения (описание макроса) MACRO, ENDM Макрокоманды (вызов макроса) Макрогенерация и макроподстановка Макродирективы WHILE, REPT, IRP, EXITM, GOTO, IF

Макросредства ассемблера 94 Макроопределение Размещение макроопределения в программе - в начале программы (до сегмента данных); - в отдельном файле ( include имя файла ) ;Суммирование слов X:=X+Y SUM MACRO X,Y MOV AX,Y ADD X,AX ENDM имя_макроса MACRO [список_формальных_параметров] ENDM ;Настройка DS на сегмент данных SETDS MACRO MOV MOV DS,AX ENDM ;Вывод строки символов ASCII OUTSTR MACRO STR MOV AH,9 MOV DX,OFFSET STR INT 21h ENDM

Макросредства ассемблера 95 Вызов макросов: макрокоманды INCLUDE C:\TASM\MACRO.ASM.DATA S DB Hello, world!$ M1 DW 7 M2 DW 15. CODE START: SETDS OUTSTR S SUM M1,M2 STOP 0 END START STOP MACRO RC MOV AH,4Ch MOV AL,RC INT 21h ENDM имя_макроса [список_фактических_параметров].DATA S DB Hello, world!$ M1 DW 7 M2 DW 15. CODE START: MOV MOV DS,AX MOV AH,9 MOV DX,OFFSET S INT 21h MOV AX,M2 ADD M1,AX MOV AH,4Ch MOV AL,0 INT 21h END START

Макросредства ассемблера 96 58E3F2007D2A11 CD FD9 50AC2300FC472F 1A85B205810EA6 7F3BC58E3F2007 D2A11CD FD950AC2300F C472F1A85B EA6D950AC2C 23 Ассемблирование программ, содержащих макросы Макрогенерация : поиск макрокоманд в исходной программе и замена на последовательность команд, описанных в соответствующих макроопределениях, с заменой формальных параметров на фактические (макроподстановка) Ассемблирование: создание объектного кода из полученного исходного текста. INCLUDE SETDS... STOP 3... STOP MACRO RC... ENDM Исходная программа... MOV MOV DS,AX... MOV AH,4Ch MOV AL,3 INT 21h... Макрогенерация Ассемблирование Объектный код

Макросредства ассемблера 97 Особенности использования макросов Программист обязан следить за соответствием типов формальных и фактических параметров и возможностью использования тех или иных типов в конкретных командах тела макроса. Фактические параметры, содержащие пробелы или разделители ( «,» или «.»), должны быть заключены в угловые скобки, например В качестве формальных параметров можно использовать не только операнды команд, но и любые лексемы и их последовательности в теле макроса При использовании меток в теле макроса следует описать их с помощью директивы LOCAL список_имен ( для автоматической замены повторяющихся меток ) Если в теле макроса используются регистры процессора, то нужно иметь в виду, что содержимое этих регистров возможно будет испорчено.

Макросредства ассемблера 98 Макродирективы Макродирективы повторения: WHILE REPT IRP Директивы управляются процессом макрогенерации: EXITM GOTO Макродиректива условной компиляции: IF

Процедуры 99 Процедуры в ассемблере Стек и стековые команды PUSH, POP, PUSHF, POPF, PUSHA, POPA Описание процедуры PROC, ENDP Вызов процедуры и возврат CALL, RET Интерфейс с процедурой (передача параметров) - через регистры - через память - через стек Сравнительный анализ макросов и процедур Модульное программирование Прерывания и системные вызовы INT, IRET

Процедуры Стек Дно стека SS:N....MODEL SMALL.STACK N.DATA....CODE... SS:SP SS:0 Вершина стека N – размер стека (количество байтов в сегменте стека) (

Процедуры 101 Работа со стеком В А С А А А PUSH B POP B PUSH A. STACK N POP X POP A PUSH C B:=B SP=N-2 SP=N-4 SP=N- 2 X:=C SP=N-2 A:=A SP=N 0 SP=N-4 PUSH операнд (SP:=SP-2, [SS:SP]:=операнд) POP операнд (операнд:=[SS:SP], SP:=SP+2) Тип операнда - r16, sr16, m16 ( i16 для i80186 ) ; недопустимая команда POP CS Назначение стека Временное сохра нение данных (регистров); Обмен данными между регистрами или ячейками памяти: PUSH AX POP BX ; BX:=AX Реализация м еханизма вызова процедур ; П ередача параметров при вызове процедур ; PUSHF (SP:=SP-2, [SS:SP]:=FLAGS) POPF (FLAGS:=[SS:SP], SP:=SP+2) SP А

Процедуры 102 Процедуры (безусловный переход с возвратом) PROC Р... RET... Использование процедур: Описание процедуры (директива PROC ); Вызов процедуры (команда CALL ); Возврат из процедуры в точку вызова (команда RET ); Передача параметров при вызове процедур;... CALL Р...

Процедуры 103 Описание процедуры имя_процедуры PROC [NEAR|FAR] (последовательность команд) [имя_процедуры] ENDP Имя процедуры обрабатывается ассемблером как метка; Тело процедуры состоит из последовательности произвольных команд; NEAR – процедура доступна только из того сегмента, где она описана (по умолчанию); FAR – процедура может быть вызвана из других сегментов; Процедура может быть описана: Между директивой.code и точкой входа (меткой start ); После последней команды сегмента кода; В отдельном сегменте кода; В другом модуле ( исходном файле).

Процедуры 104 Вызов процедуры CALL [SHORT] имя (SP:=SP-2,[SS:SP]:=IP,IP:=offset имя) CALL FAR PTR имя (SP:=SP-2,[SS:SP]:=CS,SP:=SP-2,[SS:SP]:=IP, CS:=seg имя,IP:=offset имя) Вызов процедуры выполняется как безусловный переход: JMP имя_процедуры Модификатор SHORT (короткий переход) требует формировать однобайтное смещение для адреса ( ) В стеке сохраняется адрес возврата из процедуры (содержится в регистрах CS:IP перед выполнением команды CALL ) - NEAR вызов (внутрисегментный, ближний ) сохраняет только IP ( EIP ) - FAR вызов (межсегментный, дальний ) сохраняет и CS и IP ( EIP ) Допускаются вложенные вызовы процедур

Процедуры 105 Возврат из процедуры RET [число] Ближний: IP:=[SS:SP],SP:=SP+2+число Дальний: IP:=[SS:SP],CS:=[SS:SP+2],SP:=SP+4+число Извлекает из стека ранее сохраненный адрес возврата: - IP для ближнего вызова - CS и IP для дальнего вызова Тип возврата ассемблер определяет автоматически (желательно описание процедуры производить ранее, чем был указан ее вызов!); Удаляет из стека заданное число (тип i16 ) байтов (SP:=SP+число) (без учета адреса возврата!); Передает управление по адресу CS:IP

Процедуры 106 Интерфейс с процедурой: методы передачи параметров Что передавать? передача по значению – передается значение параметра: procedure P (X : integer) передача по ссылке – передается адрес параметра: procedure P (var X : integer) Как передавать? через регистры; через стек; через общие области памяти;

Процедуры 107 Передача параметров по значению с использованием регистров Пример: Вычислить R=max(a,b)+max(c,d) ;Процедура AХ:=max(AX,BX) ;Параметры: АХ–первое число,ВХ–второе число ;Результат в АХ MAX PROC CMP AX,BX ; сравниваем (AX) и (BX) JGЕ MX ; если (AX) больше - выход MOV AX,BX ; иначе AX:=BX MX: RET ENDP ;Основная программа... MOV AX,A ; подготовка параметров в AX и BX MOV BX,B ; для вызова процедуры CALL MAX ; AX:=MAX(A,B) PUSH AX ; спасти AX MOV AX,C ; подготовка параметров для MOV BX,D ; нового вызова процедуры CALL MAX ; AX:=max(C,D) POP R ; R:=MAX(A,B) ADD R,AX ; R:=R+MAX(C,D)... ;Основная программа... MOV AX,A ; подготовка параметров в AX и BX MOV BX,B ; для вызова процедуры CALL MAX ; AX:=MAX(A,B) PUSH AX ; спасти AX MOV AX,C ; подготовка параметров для MOV BX,D ; нового вызова процедуры CALL MAX ; AX:=max(C,D) POP R ; R:=MAX(A,B) ADD R,AX ; R:=R+MAX(C,D)...

Процедуры 108 Передача параметров по ссылке с использованием регистров ;Процедура AX:=Σ(Xi), i=1..N ;Параметры: BX – адрес массива,CX – число эл-тов ;Результат (сумма элементов) в АХ SUM PROC PUSH SI ;спасаем SI MOV AX,0 ;обнулить сумму MOV SI,0 ;индекс массива (SI)=0 NXT: ADD AX,[BX][SI] ;AX:=AX+Xi ADD SI,2 ;SI:=SI+2 только для слов! LOOP NXT ;повторить суммирование POP SI ;восстановить SI RET ENDP ;Основная программа... X DW 1,2,3,4,5 MAS DW 7,8,9... LEA BX,X ;адрес начала массива в BX MOV CX,5 ;число элементов массива в CX CALL SUM... LEA BX,MAS ;адрес начала массива в BX MOV CX,3 ;число элементов массива в CX CALL SUM ;Основная программа... X DW 1,2,3,4,5 MAS DW 7,8,9... LEA BX,X ;адрес начала массива в BX MOV CX,5 ;число элементов массива в CX CALL SUM... LEA BX,MAS ;адрес начала массива в BX MOV CX,3 ;число элементов массива в CX CALL SUM

Процедуры 109 Передача параметров через стек а 3 а 2 BP+6 BP+4 BP BP+8 SP 1 SP 2 ;Вызов процедуры P PUSH A1 PUSH A2 PUSH A3 CALL P ;Процедура P P PROС NEAR PUSH BP MOV BP,SP ; BP:=SP... MOV AX,[BP+4] ; AX:=a3 MOV BX,[BP+6] ; BX:=a2 MOV CX,[BP+8] ; CX:=a1... POP BP ;убрать BP из стека RET 6 ;убрать параметры END P Procedure p (a1,a2,a3) Вызывающая программа: - размещает параметры в стеке - о существляет вызов процедуры Процедура: - в начале работы извлекает параметры из стека - пе ред завершением работы очищает стек. а 1 а 1... а 3 IP-адрес возврата BP...

Процедуры 110 Пример (суммирование элементов массива) ; Процедура AX:=Σ(Xi), i=1..N SUM PROС NEAR PUSH BP ; пролог процедуры MOV BP,SP ; PUSH BX ; спасаем регистр BX PUSH CX ; спасаем регистр CX MOV CX,[BP+4] ; 2-й параметр – N MOV BX,[BP+6] ; 1-й параметр – адрес массива MOV AX,0 ; обнулить сумму NEXT: ADD AX,[BX] ; AX:=AX+Xi ADD BX,2 ; BX:=BX+2 (для слов!) LOOP NEXT POP CX ; восстанавливаем регистры POP BX ; восстанавливаем ВХ POP BP ; восстанавливаем ВР RET 4 ; возврат с очисткой стека ENDP ;Основная программа X DW 1,2,3,8,12 N EQU 5... LEA AX,X ;адрес массива PUSH AX ;первый параметр в стек MOV AX,N ;число элементов массива PUSH AX ;второй параметр в стек CALL SUM ;вызов процедуры... ;Основная программа X DW 1,2,3,8,12 N EQU 5... LEA AX,X ;адрес массива PUSH AX ;первый параметр в стек MOV AX,N ;число элементов массива PUSH AX ;второй параметр в стек CALL SUM ;вызов процедуры... а 3 адрес X BP+6 BP+4 BP N IP-адрес возврата BP BX СXСX

Процедуры 111 Сравнительный анализ макросов и процедур ;Пример (комбинирование макросов и процедур) SUMMA MACRO MAS,N LEA AX,MAS PUSH AX MOV AX,N PUSH AX CALL SUM SUMMA ENDM... SUMMA X,5 Более эффективны с точки зрения использования памяти Не эффективно использует память Уступают в быстродействии Более эффективный по скорости код Текст в одном экземпляре, при вызове передается управление Текст добавляется к программе при каждом вызове Текст неизменен Текст изменяется в зависимости от параметров Многократное использование в программе единожды описанного кода Процедуры Макросы

Процедуры 112 Модульное программирование на Ассемблере p1. asm p2. asm p3. asm tasm p1. obj tasm p2. obj tasmp3. obj tlinkproject.exe TLINK P1. OBJ P2. OBJ P3. OBJ PROJECT.EXE Средства разрешения внешних ссылок EXTRN имя:тип [{,имя:тип}] Объекты, которые используются в этом модуле, но декларируются вне его Имя: переменная (BYTE, WORD,...), процедура или метка (NEAR,FAR), константа (АВС) Объекты, которые декларированы в данном модуле и должны быть доступны в других модулях. PUBLIC имя [{,имя}]

Процедуры 113 Пример многомодульной программы ;МОДУЛЬ 1 (MOD1.ASM).MODEL SMALL.DATA....CODE PROC1 PROC FAR... PROC1 ENDP PUBLIC PROC1 ;Общее имя ;для всех... END ;Метка не указывается! TASM MOD1. ASM TASM MOD2. ASM TLINK MOD1. OBJ MOD2. OBJ PRG.EXE ;МОДУЛЬ 2 (MOD2.ASM).MODEL SMALL.STACK 256.DATA....CODE EXTRN PROC1:FAR ;Внешнее имя START:... CALL PROC1... END START ;Общая точка входа Порядок создания многомодульной программы:

Процедуры 114 Прерывания и системные вызовы Выполняемая программа Операционная система Устройства и процессор Типы прерываний: аппаратные (внешние) программные (системный вызов) исключения Системный вызов Обработка прерываний

Процедуры 115 Механизм обработки прерываний Прерывание Х... IRET... Прерывания входят в состав ОС и различаются по номерам (Х=0÷255); Адреса всех прерываний хранятся в системной таблице векторов прерываний Вызов прерывания (команда INT ): для внешних прерываний и исключений – автоматически, для системных вызовов – явно; Возврат из прерывания в точку вызова (команда IRET ); Передача параметров при вызове прерываний осуществляется через регистры;... Выполняемая программма... INT X... Прерывание = процедура обработки прерывания Таблица векторов S x :D x 0:0 S x :D x 0:4*X

Процедуры 116 Вызов и возврат из прерывания INT номер (SP:=SP-2,[SS:SP]:=Flags, SP:=SP-2,[SS:SP]:=CS, SP:=SP-2,[SS:SP]:=IP, CS:IP:=[0:4*номер]) запись в стек регистра флагов ( Flags ) и адреса возврата ( CS:IP ); дальний переход ( JMP FAR) по адресу, извлекаемому из таблицы векторов прерываний в соответствии с номером прерывания (по смещению 4*номер);... INT 5... Таблица векторов S 5 :D :20... Обработчик прерывания 5... IRET... S 5 :D 5 IRET IP:=[SS:SP],CS:=[SS:SP+2],Flags:=[SS:SP+4],SP:=SP+6 извлечение из стека ранее сохраненных регистров ( CS:IP и Flags ) передача управления по адресу CS:IP ( возобновление выполнения прерванной программы)... IP CS Стек Flags

Процедуры 117 Использование прерываний ; Вывод символа на экран MOV AH,9 MOV AL,код_символа MOV BL,атрибут_символа MOV CX,число_повторений INT 10h Размещение прерываний 0÷31 – поддерживаются аппаратно (входят в состав BIOS) 32÷255 – поддерживаются программно (входят в состав ОС) Назначение прерываний 0,1,3,4 – обработка исключений 2,8÷15, – обработка аппаратных прерываний остальные – обработка системных вызовов (программные прерывания, которые можно вызывать командой INT) Некоторые прерывания (16, 20, 23, 33 и др.) включают несколько различных функций. При вызове функций следует дополнительно указывать номер функции, записывая его в регистр AH Перед вызовом программного прерывания, следует записать в указанные регистры входные параметры (если потребуется) Результаты работы программного прерывания возвращаются также через регистры ; Чтение символа с экрана MOV AH,8 INT 10h ;AL=код_символа ;AH=атрибут_символа

Процедуры 118 Примеры использования прерывания 33 (21h) MS DOS ; Завершение программы MOV AH,4Ch MOV AL,код_завершения INT 21h ; Вывод символа на экран MOV AH,2 MOV DL,код символа INT 21h ; Вывод строки на экран.data STR DB Hello!$... MOV AH,9 LEA DX,STR INT 21h ; Удаление файла.data FName DB C:\COMMAND.COM MES1 DB Файл не найден$ MES2 DB Файл удален!$... MOV AH,41h LEA DX,FName INT 21h JNC succ;CF=0 -> успех MOV AH,9;CF=1 -> ошибка LEA DX,MES1 INT 21h JMP fin succ: MOV AH,9 LEA DX,MES2 INT 21h fin:...

Программные сегменты 119 Сегментирование памяти Сегмент памяти – непрерывная область памяти, предназначенная для размещения каких- либо блоков программы (данных, кода) Размер сегмента - для шестнадцатиразрядных приложений не более 2 16 = 64 Кб; - для тридцатидвухразрядных приложений не более 2 32 = 4Гб. Сегменты могут размещаться в памяти произвольно по отношению друг к другу (даже пересекаться или совпадать) В командах обычно указывают эффективный адрес (смещение) операнда, а а сегментная часть адреса извлекается по умолчанию из одного из 6 сегментных регистров ( CS, DS, SS, ES, GS, FS ). Сегментные регистры используются по умолчанию для формирования адреса в командах: DS - команды пересылки, арифметические, логические и др., использующие данные в памяти; CS - команды перехода ( JMP, CALL ); SS - команды работы со стеком ( PUSH, POP ) и команды, использующие косвенную адресацию по BP ; Остальные сегментные регистры никакой привязки изначально не имеют. Можно использовать адресацию с явным определением сегментного регистра: MOV AX,ES:MEM JMP GS:[BX]

Программные сегменты 120 Определение программных сегментов выравнивание BYTE|WORD|DWORD|PARA – устанавливает, что адрес начала сегмента должен быть кратен соответственно байту, слову, двойному слову, параграфу (16 б) объединение показывает, как данный сегмент будет объединяться с одноименными сегментами PRIVATE – не объединять с другими сегментами (используется по умолчанию); PUBLIC – будет выделен один общий программный сегмент для всех одноименных сегментов; COMMON – будет выделен один сегмент памяти для всех одноименных сегментов (наложение); STACK – определение сегмента стека (объединяются все сегменты) класс символическое имя в кавычках, которое используется как дополнительный признак для размещения или объединения сегмента размер USE16 | USE32 – использовать 16-ти или 32-х разрядное смещение ( IP/EIP ) имя_сегмента SEGMENT [выравнивание][объединение][класс][размер] имя_сегмента ENDS

Программные сегменты 121 Программные сегменты ; A SEGMENT A1 DB 400 DUP(?) A2 DW 8 A ENDS ; B SEGMENT B1 DW A2 B2 DD A2 B ENDS ; C SEGMENT L: MOV BX,B1... C ENDS ; Все сегменты равноправны (не несут информации о их содержимом) Сегменты кода следует размещать после сегментов данных!!

Программные сегменты 122 Директива ASSUME ES и DS программист должен формировать сам; SS – формируется автоматически, если сегмент описан с ключевым словом STACK ; CS – формируется автоматически по адресу стартовой метки кода, установленной в END или по значению, указанному в ASSUME. ASSUME {sr:имя_сегмента[,]} ;Пример 1 (см. стр. 113) ASSUME ES:A,DS:B,CS:C MOV AX,A2 ;AX:=(ES:A2) MOV BX,B1 ;BX:=(DS:B1) Устанавливает соответстви е между программными сегментами и сегментными регистрами ( sr ) Загрузка регистров не производится! ;Пример 2 C1 SEGMENT ASSUME CS:C1... JMP FAR PTR L... C1 ENDS С2 SEGMENT ASSUME CS:C1... L:... C2 ENDS

Программные сегменты 123 Модели памяти Модель : TINY – код, данные, и стек будут размещаться в одном сегменте памяти размером 64 Кб ( используется при создании программ формата.com ) SMALL – один сегмент для кода, один сегмент для. MEDIUM – несколько сегментов кода, один сегмент данных. COMPACT – один сегмент кода и несколько сегментов данных. LARGE – несколько сегментов кода и несколько сегментов данных. FLAT – один сегмент на все. Совпадает с TINY, но занимает область до 4 Гб. Модификатор USE16|USE32. MODEL [модификатор] модель

Программные сегменты 124 Упрощенные директивы определения сегментов Константы, действующие при использовании – принимает значение адреса сегмента – принимает значение адреса сегмента – принимает значение адреса сегмента стека..CODE [имя] _TEXT SEGMENT WORD PUBLIC CODE.STACK [размер] STACK SEGMENT PARA PUBLIC STACK.DATA _DATA SEGMENT WORD PUBLIC DATA Это определение действует для моделей TINY, SMALL, COMPACT Устанавливает CS на начало сегмента кода ( ASSUME CS:_TEXT)

Программные сегменты 125 Порядок описания и загрузки сегментов Сегменты описывают в программе в любом порядке. Сегмент кода следует размещать ниже сегмента данных, чтобы исключить проблему неопределенности адресов переменных; Сегменты одного класса размещаются рядом; Все сегменты типа PUBLIC объединяются в одном сегмент памяти, если они имеют одинаковые имена; Сегменты с общей директивой COMMON накладываются в памяти друг на друга (в одном сегменте памяти).