- •1)Блочная структура программы: внутренние и внешние процедуры
- •3) Блочная структура программы: расположение процедур в исходном файле
- •4) Использования прерываний в ассеемблер-программах
- •5)Команды передачи управления: безусловные переходы. Адресация в переходах
- •6) Команды передачи управления: организация циклов
- •7) Команды передачи управления: условные переходы
- •8) Команды сдвигов и их использования
- •13. Место языков ассемблера среди языков программирования.
- •14. Модели памяти и их использования в tasm.
- •16. Передача параметров между процедурой и вызывающей программой Ассемблер.
- •17. Предложение языка ассемблера: директивы.
- •18. Предложения языка ассемблера: команды.
- •19. Предложения языка ассемблера: коментарии.
- •20. Представление данных в ibm pc: алфавитно-цифровые данные
- •21 Представление данных в ibm pc : Вещественные данные
- •22 Представление данных в ibm pc: Двоично-десятичных чисел
- •23 Представление данных в ibm pc: Целые числа
- •24 Программные пакеты masm и tasm общие функции и различие
- •29. Способы адресации в командах мп intel 80 * 86
- •Регистровая адресация
- •Непосредственная адресация
- •30.Способы передачи параметров между процедурой и вызывающейся программой
- •31. Стек . Работа со стеком
- •32. Структуры и форматы команд мп intel 80 * 86. Команды пересылки данных
- •34. Структура мп Intel 80x86: используемые регистры
- •35. Структура мп Intel 80x86: Операционное устройство, Устройство шинного интерфейса
35. Структура мп Intel 80x86: Операционное устройство, Устройство шинного интерфейса
Операционное
устройство МП содержит
группу общих регистров, арифметико-логическое
устройство (АЛУ) и регистр флагов
F.
Восемь 16-битовых регистров
общего назначения участвуют
во многих командах.
В соответствии
с основным назначением рассматриваемых
регистров выделяют регистры АХ, ВХ, СХ,
DX, используемые прежде всего для хранения
данных, и регистры SP (Stack Pointer), BP (Branch
Pointer), SI (Stack Index), DI (Data Index), которые хранят
главным образом адресную информацию.
Особенностью регистров АХ, ВХ, СХ, DX
является то, что они допускают
раздельное использование их младших
байтов AL, BL, CL, DL и старших байтов АН, ВН,
СН, DH. Тем самым обеспечивается
возможность обработки как слов, так и
байтов и создаются необходимые
условия для программной совместимости
с МП 8080. Все остальные регистры являются
неделимыми и оперируют 16-битовыми
словами, даже в случае использования
только старшего или младшего байта.
Указательные регистры SP и BP хранят
смещение адреса в пределах текущего и
стекового сегмента памяти, а индексные
регистры SI и DI хранят смещение адреса
соответственно в текущем сегменте
данных и в текущем дополнительном
сегменте. Однако при использовании этих
регистров для адресации операндов
возможна смена сегментов памяти.
Кроме
основных функций, соответствующих
названию регистров, общие регистры
выполняют и ряд специальных
функций.
АЛУ содержит
16-битовый комбинационный сумматор, с
помощью которого выполняются арифметические
операции, наборы комбинационных схем
для выполнения логических операций,
схемы для операций сдвигов и десятичной
коррекции, а также регистры для временного
хранения операндов и результатов.
К
АЛУ примыкает регистр флагов F (рис.
2.3). Его младший байт FL полностью
соответствует регистру флагов МП Intel
8080, а старший байт FH содержит четыре
дополнительных флага. Шесть
арифметических флагов фиксируют
определенные признаки результата
выполнения операции (арифметической,
логической, сдвига или загрузки
регистра флагов). Значения этих флагов
(кроме флага AF) используются для реализации
условных переходов, изменяющих ход
выполнения программы. Различные команды
влияют на флаги по-разному.
Рис.
2.3. Формат регистра флагов F
Назначение
арифметических флагов:
CF
(Carry Flag) - флаг переноса.
PF (Parity Flag) -
флаг четности (или паритета).
AF
(Additive Flag) - флаг вспомогательного переноса,
фиксирует перенос (заем) из младшей
тетрады в старшую при сложении
(вычитании.
ZF (Zero Flag) - флаг нуля.
SF
(Sign Flag) - флаг знака.
OF (Overflow Flag) - флаг
переполнения.
Для управления некоторыми
действиями МП предназначены три
дополнительных флага.
DF (Direct Flag) - флаг
направления, управляемый командами
CLD и STD; определяет порядок обработки
цепочек в соответствующих командах:
от меньших адресов (DF = 0) или от больших
(DF = 1).
Устройство шинного интерфейса содержит блок сегментных регистров, указатель команд, сумматор адресов, очередь команд и буферы, обеспечивающие связь с шиной. Шинный интерфейс выполняет операции обмена между МП и памятью или портами ввода-вывода по запросам операционного устройства. Когда операционное устройство занято выполнением команды, шинный интерфейс самостоятельно инициирует опережающую выборку кодов очередных команд из памяти. Очередь команд представляет собой набор байтовых регистров и выполняет роль регистра команд, в котором хранятся коды, выбранные из программной памяти. Длина очереди составляет 6 байт, что соответствует максимально длинному формату команд. Наличие очереди команд, а также способность операционного устройства и шинного интерфейса работать параллельно позволяют совместить во времени фазы выборки команды и выполнения заданной операции: пока одна команда исполняется в операционном устройстве, шинный интерфейс осуществляет выборку следующей команды. Таким образом, достигаются высокая плотность загрузки шины и повышение скорости выполнения программы. Буфер шины адреса/данных (БАД) содержит 16 двунаправленных управляемых усилителей с тремя выходными состояниями и обеспечивает номинальную нагрузочную способность линий AD15-AD0. Буфер шины адреса/состояния (БАС) содержит четыре однонаправленных усилителя с тремя выходными состояниями и обеспечивает номинальную нагрузочную способность линий A19/S6-A16/S3.
36.
Регистр флагов был уже в первом 16-разрядном микропроцессоре Intel — 8086. Он носил имя FLAGS и имел длину 16 бит. Появление микропроцессора 80286 добавило в регистр FLAGS бит NT и битовое поле IOPL, однако сам регистр оставался 16-разрядным.
С выходом микропроцессора 80386 регистр был расширен до 32 бит и стал называться EFLAGS. В нём появились ещё два дополнительных бита: VM и RF. В последующих поколениях 32-разрядных микропроцессоров были добавлены биты AC, VIF, VIP и ID. Тем не менее, сохранялась полная совместимость «снизу вверх»: любая старая программа, которая корректно работала с регистром EFLAGS, не модифицируя «неизвестные» ей биты, оставалась работоспособной и на последующих процессорах.
Расширение разрядности процессора до 64 бит, первоначально произведённое компанией AMD (технология AMD64) и позже скопированное Intel (EM64T), удвоило и размер регистра флагов, получившего название RFLAGS. Однако его старшая половина (биты с 32-го по 63-й включительно) пока не используется и является зарезервированной, поэтому формат «значащей» части RFLAGS полностью совпадает с форматом EFLAGS.
Назначение
разрядов
Править
Формат регистра EFLAGS выглядит следующим образом:
Заметим, что все неиспользуемые биты равны нулю. Исключением является бит 1, который всегда имеет единичное значение.
Далее описывается назначение каждого бита, входящего в состав регистра флагов.
Флаги состояния Править
Эти флаги отражают результат, полученный в предыдущей арифметико-логической операции. Многие из них могут использоваться в дальнейшем для выполнения условных переходов или условных пересылок.
Флаги этой группы могут изменяться любыми программами с помощью команд, заносящих в регистр флагов новое значение (SAHF, POPF/POPFD/POPFQ).
CF |
Флаг переноса (бит 0). На самом деле он имеет разное назначение в зависимости от выполняемой инструкции. В арифметических операциях над целыми числами этот флаг, будучи установленным, показывает наличие переноса или заёма (это можно рассматривать как «беззнаковое переполнение»), а будучи сброшеннм — отсутствие переноса или заёма. Кроме того, этот флаг применяется в некоторых других инструкциях и тем или иным образом характеризует полученный результат. Подробно использование этого флага в каждой конкретной инструкции указывается в её описании |
PF |
Флаг чётности (бит 2). Устанавливается, если младший байт результата содержит чётное число единичных битов, в противном случае сбрасывается |
AF |
Флаг вспомогательного переноса (бит 4). Устанавливается при возникновении переноса или заёма из 4-ого раззряда в 3-ий разряд. Сбрасывается при отсутствии такового. Используется командами десятичной коррекции. |
ZF |
Флаг нуля (бит 6). Устанавливается при получении нулевого результата, сбрасывается в противном случае. |
SF |
Флаг знака (бит 7). Устанавливается, если в результате операции получено отрицательное число, т.е. если старший разряд результата равен единице. В противном случае сбрасывается |
OF |
Флаг переполнения (бит 11). Устанавливается, если в результате арифметической операции зафиксировано знаковое переполнение, то есть если результат, рассматриваемый как число со знаком, не помещается в операнд-приёмник. Если знакового переполнения нет, этот флаг сбрасывается |
Флаг направления Править
Этот флаг может изменяться любыми программами с помощью специальных инструкций CLD и STD, а также загрузкой нового содержимого регистра флагов.
DF |
Флаг направления (бит 10). Когда этот флаг сброшен, строковые операции (MOVS, CMPS, SCAS, LODSи STOS) обрабатывают данные в порядке возрастания адресов (увеличивая содержимое регистров SI/ESI/RSI и DI/EDI/RDI после каждой итерации), а когда установлен — в порядке убывания адресов (уменьшая содержимое указанных регистров после каждой итерации) |
Системные флаги Править
Эти флаги могут изменяться только системным программным обеспечением, работающим при нулевом (наивысшем) текущем уровне привилегий (CPL). Исключением является флаг IF, состояние которого в определённых условиях может меняться менее привилегированным кодом. Загрузка регистров флагов программами, выполняющимися не на нулевом уровне привилегий, не изменяет значения системных флагов.
TF |
Флаг ловушки (бит 8). Когда установлен, вызывает прерывание #DB (вектор 1) после выполнения каждой команды процессора за исключением той, которая осуществила установку этого флага |
IF |
Флаг разрешения прерывания (бит 9). Когда установлен, процессор обрабатывает маскируемые прерывания, запросы на которые поступают от контроллера прерываний илиулучшенного контроллера прерываний. Когда сброшен, маскируемые прерывания процессором игнорируются (находятся в ожидании обработки). Возможностью установки и сброса флага IF программами, выполняющимися не на нулевом уровне привилегий, управляют поле IOPL регистра флагов и бит VE управляющего регистра CR3 |
IOPL |
Поле уровня привилегий ввода/вывода (биты 12 и 13). Содержит уровень привилегий ввода-вывода для выполняемой в настоящий момент программы. Если текущий уровень привилегий (CPL) программы численно меньше либо равен значению, находящемуся в поле IOPL, программа может использовать инструкции ввода-вывода, а также менять состояние флага IF. Поле IOPL дополняется картой разрешения ввода-вывода в TSS, а также битом VME в управляющем регистре CR4 |
NT |
Вложенная задача (бит 14). Этот флаг устанавливается процессором автоматически при переключении на новую задачу. Переключение на задачу происходит при использовании её в качестве обработчика прерывания через шлюз задачи в IDT или при её вызове командой CALL, обращённой к TSS или шлюзу задачи, находящимся в GDT или LDT |
RF |
Флаг возобновления (бит 16). Управляет реакцией процессора на точки останова. Когда установлен, запрещает генерацию отладочных прерываний (#DB). Основной функцией флага RF является обеспечение повторного выполнения инструкции после возникновения отладочного прерывания, вызванного точкой останова. Для этого отладчик перед возвратом к прерванной программе должен установить этот бит в регистре флагов прерванной программы, сохранённом в стеке, что обеспечит нормальное выполнение инструкции, к которой произойдёт возврат из отладчика. После её выполнения процессор автоматически сбросит флаг RF, что обеспечит нормальное функционирование установленных точек останова |
VM |
Режим виртуального процессора 8086 (бит 17). Когда этот флаг установлен, процессор работает в режиме виртуального процессора 8086 |
AC |
Проверка выравнивания (бит 18). Когда одновременно установлены этот флаг и бит AC управляющего регистра CR0, а программа выполняется на третьем уровне привилегий, активизируется проверка выравнивания операндов, расположенных в памяти. При попытке доступа к невыровненному операнду возникает исключение #AC (вектор 17) |
VIF |
Виртуальный флаг разрешения прерывания (бит 19). Этот флаг используется совместно с флагом VIP, если в управляющем регистре CR4 установлен бит VME, разрешающий использование расширений режима виртуального процессора 8086 |
VIP |
Ожидающее виртуальное прерывание (бит 20). Этот флаг используется совместно с флагом VIF, если в управляющем регистре CR4 установлен бит VME, разрешающий использование расширений режима виртуального процессора 8086 |
ID |
Идентификация (бит 21). Возможность программно устанавливать и сбрасывать этот флаг служит признаком того, что процессор поддерживает инструкцию CPUID |
Оставшиеся команды микропроцессора 8088 управляют его работой.
Многие из них устанавливают или сбрасывают некоторые флаги
состояния.
Установка флагов
Есть три команды, которые непосредственно управляют состоянием
флага переноса. Команды STC, CLC, CMC соответственно могут
устанавлмвать, сбрасывать и изменять флаг переноса. Этот флаг -
единственный, которому уделено такое внимание, и в первую очередь,
благодаря важности флага переноса при операциях с повышенной
точностью. Флаг переноса критичен на промежуточных шагах любых
многословных операций. Возможность сбрасывать или устанавливать
флаг переноса может помочь при циклической обработке с повышенной
точностью. На Фиг. 4.31 показан пример использования команды CLC.
Цикл внутри примера складывает отдельные байты двух 10-разрядных
упакованных десятичных чисел. Программа выполняет цикл пять раз,
так как за каждую итерацию она обрабатывает две цифры. Информация
о переносе из одного оборота цикла в другой передается через флаг
переноса. Команда CLC сбрасывает флаг переноса перед первым циклом
для того, чтобы перед первым сложением не было переноса. Флаг
переноса также важен в операциях сдвига, где он становится девятым
или семнадцатым битом регистра во время выполнения операции.
Два флага состояния микропроцессора имеют специальные команды
работающие с ними. Программа может установить или сбросить маску
прерываний соответственно командами STI и CLI. Команда STI включает
систему прерываний микропроцессора 8088, позволяя ему реагировать
на внешние прерывания. Команда CLI блокирует систему внешних
прерываний.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:02:06
Фиг. 4.31 Десятичная арифметика повышенной точности Page 1-1
PAGE ,132
TITLE Фиг. 4.31 Десятичная арифметика повышенной точности
0000 CODE SEGMENT
ASSUME CS:CODE,DS:CODE
= 0005 NUMBER_LENGTH EQU 5 ; 5 байт для упакованного числа
0000 0005[ NUMBER_ONE DB NUMBER_LENGTH DUP (?)
??
]
0005 0005[ NUMBER_TWO DB NUMBER_LENGTH DUP (?)
??
]
;----------------------------------------
; Эта программа складывает два десятичных упакованных
; числа (NUMBER_ONE и NUMBER_TWO) и заносит результат
; в NUMBER_TWO.
;----------------------------------------
000A START_ADD:
000A B9 0005 MOV CX, NUMBER_LENGTH ; Определение длины чисел
;----- Установка индексных регистров на младший байт складываемых чисел
000D 8D 36 0004 R LEA SI, NUMBER_ONE + NUMBER_LENGTH - 1
0011 8D 3E 0009 R LEA DI, NUMBER_TWO + NUMBER_LENGTH - 1
0015 F8 CLC ; Нет младших разрядов
0016 ADD_LOOP:
0016 8A 04 MOV AL, [SI] ; Взять байт из первого числа
0018 12 05 ADC AL, [DI] ; Добавить из второго с учетом переноса
001A 27 DAA ; Коррекция до упакованного формата
001B 88 05 MOV [DI], AL ; Занесение байта результата
001D 9C PUSHF ; Сохранение флага переноса (CF)
001E 4E DEC SI ; Сдвиг указателя первого числа
001F 4F DEC DI ; Сдвиг указателя второго числа
0020 9D POPF ; Восстановление флагов
0021 E2 F3 LOOP ADD_LOOP ; Обработка следующего байта
0023 CODE ENDS
END
Фиг. 4.31 Операции с BCD повышенной точности
Программа может установить или сбросить флаг направления с
помощью команд STD и CLD. Команда CLD сбрасывает флаг направления,
приводя к тому, что строковые команды ведут обработку при
возрастающих адресах памяти. Команда STD устанавливает флаг, в
результате чего строковые команды уменьшают адресный указатель
после каждого выполнения.
37. структура файла ассемблер-программы
Программа на ассемблере представляет собой набор предложений языка, каждое из которых занимает отдельную строку кода программы, в них м.б. записаны:
- инструкции процессора, которые транслируются в машинный код программы; - директивы, которые указывают транслятору на необходимость выполнения некоторых действий, и при трансляции не создают машинный код. - макрокоманды – символьные обозначения, которые во время трансляции программы замещаются одним или несколькими ассемблерными предложениями;
Также, каждая инструкция программы может иметь свою метку – имя, которое будет однозначно описывать местонахождение этой инструкции в программе. Имя метки пишется в самом начале строки и отделяется двоеточием. При необходимости, в конце любого предложения, программист может поместить комментарий, отделив его точкой с запятой.
Для того чтобы создать из текста программы работоспособный исполняемый EXE-файл, необходимо выполнить два действия – создать из текста объектный файл (OBJ), а затем из объектного – исполняемый.
Для этого, в командной строке ДОС необходимо выполнить две команды:
tasm prog.asm – для трансляции программы в OBJ-файл tlink prog.obj – для создания из OBJ-файла EXE-файла
Здесь prog.asm – имя исходного файла с текстом программы. Также, необходимо наличие в текущем каталоге файлов tasm.exe и tlink.exe.
Директивы оформления программы
Директивы SEGMENT, ASSUME, END и .386
Любая программа состоит из набора машинных команд и данных, которые во время выполнения находятся в памяти. Иногда для работы программы необходимо также дополнительное место, например под стек. В принципе, возможно совместное размещение команд, данных и стека в одном блоке памяти, но тогда появляется опасность при записи в стек или область данных повредить команды, а также усложнится отладка программы. Поэтому, целесообразнее будет использовать разные области памяти (сегменты) для хранения команд процессора, данных, и для реализации стека.
Операционная система должна знать, сколько памяти необходимо выделять под программу, какие сегменты нужно определить при запуске, и чем их нужно заполнить, а также местонахождение команды, начиная с которой происходит выполнение программы – так называемой «точки входа». Вся эта и другая полезная информация находится в исполняемом файле программы.
Для того чтобы транслятор ассемблера знал, в какой сегмент нужно положить определенные данные или команды, используется директива SEGMENT:
<имя сегмента> SEGMENT [параметры] . . . команды/данные . . . <имя сегмента> ENDS
В качестве параметров можно указать дополнительную информацию о сегменте. Например, параметр STACK указывает операционной системе, что этот сегмент будет использоваться, как системный стек.
38. односегментные и многосегментные файлы
Первый пример законченной программы, рассмотренный нами в гл. 2, относился к наиболее распространенному типу .ЕХЕ-приложений. Для такой программы характерно наличие отдельных сегментов команд, данных и стека; для адресации к полям каждого сегмента используется свой сегментный регистр. Удобство .ЕХЕ-программы заключается в том, что ее можно почти неограниченно расширять за счет увеличения числа сегментов. В случае большого объема вычислений в программу можно включить несколько сегментов команд, обеспечив, разумеется, переходы из сегмента в сегмент с помощью команд дальних переходов или дальних вызовов подпрограмм. Если же программа должна обрабатывать большие объемы данных, в ней можно предусмотреть несколько сегментов данных. Каждый сегмент не может иметь размер более 64 Кбайт, однако в сумме их объем ограничивается только наличной оперативной памятью. Правда, в реальном режиме затруднительно обратиться к памяти за пределами 1 Мбайт адресного пространства, так что максимальный размер программы, если не предусматривать в ней какие-то специальные средства поочередной загрузки сегментов, ограничен величиной 550 ... 600 Кбайт. Наличие в МП 86 лишь двух сегментных регистров данных (DS и ES) несколько усложняет алгоритмы обработки больших объемов данных, так как приходится постоянно переключать эти регистры с одного сегмента на другой. Однако реально в современных процессорах имеются не два, а четыре сегментных регистра данных (DS, ES, FS и GS), которые вполне можно использовать в приложениях DOS, упростив тем самым процедуры обращения к данным и ускорив выполнение программ. Позже все эти возможности будут рассмотрены более подробно.
Во многих случаях объем программы оказывается невелик - меньше, а часто и много меньше, чем 64 Кбайт. Такую программу нет никакой необходимости составлять из нескольких сегментов: и команды, и данные, и стек можно разместить в единственном сегменте, настроив на его начало все 4 сегментных регистра. Для односегментных программ в MS-DOS существует специальный формат и специальные правила их составления. Программные файлы с программами, составленными по этим правилам, имеют расширение .СОМ. В формате .СОМ обычно пишутся резидентные программы и драйверы, хотя любую прикладную программу небольшого объема можно оформить в виде .СОМ-приложения. Если посмотреть список системных программ, входящих в DOS, и реализующих, в частности, внешние команды DOS, то можно заметить, что приблизительно треть этих программ написана в формате .COM (COMMAND.COM, FORMAT.COM, SYS.COM и др.), а две трети - в формате .EXE (FC.EXE: PRINT.EXE, XCOPY.EXE и т.д.). Ниже мы рассмотрим правила составления и особенности исполнения как .ЕХЕ-, так и .СОМ-программ.
39. элементарные конструкции языка ассемблера: алфавит, ключевые слова
Все ассемблерные программы состоят из одного или более
предложений и комментариев. Предложение и комментарий
представляют собой комбинацию знаков, входящих в алфавит
языка, а также чисел и идентификаторов, которые тоже
формируются из знаков алфавита.
2.1. Алфавит.
Макроассемблер распознает следующий набор знаков:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
? @ _ $ : . [ ] ( ) < > { }
+ / * & % ! ' ~ | \ = # ^ ; , ` "
Конструкции языка ассемблера формируются из
идентификаторов и ограничителей.
Идентификатор представляет собой набор букв, цифр и
символов _ , ?, $ или @, не начинающийся с цифры.
Идентификатор должен полностью размещаться на одной строке и
может содержать от 1 до 31 символа (точнее, используются
только первые 31 символ идентификатора, остальные
игнорируются) . Следует заметить, что символ _ , хотя и
допускается в качестве компоненты идентификатора,
ассемблером игнорируется. Поэтому, например, идентификаторы
A_B и AB совпадают.
Друг от друга идентификаторы отделяются пробелом или
ограничителем, которым считается любой недопустимый в
идентификаторе символ.
Посредством идентификаторов представляются следующие
объекты программы:
1. Переменные.
2. Метки.
3. Имена.
Некоторые идентификаторы, называемые ключевыми
словами, имеют фиксированный смысл и должны употребляться
только в соответствии с этим. Ключевыми словами являются:
1. Директивы ассемблера.
2. Инструкции процессора.
3. Имена регистров.
4. Операторы выражений.
40)элементарные конструкции языка ассемблера: выражения и их использования
Использование выражений позволяет вам получать модульный
код, поскольку вы можете символически представлять в программе
значения. Турбо Ассемблер выполняет все повторные вычисления, не-
обходимые при изменениях (и не требует этого от вас).
В присваиваниях Турбо Ассемблер использует стандартное ин-
фиксное обозначение. Выражения могут содержать операнды и унарные
или бинарные операции. Унарная операция помещается перед одиноч-
ным операндом; бинарные операции помещаются между двумя операнда-
ми. Примеры простых операций показаны в Таблице 5.8.
Простые выражения Таблица 5.8
---------------------T------------------------------------------¬
¦ Выражение ¦ Что получается при вычислении ¦
+--------------------+------------------------------------------+
¦ 5 ¦ константа 5 ¦
¦ -5 ¦ константа -5 ¦
¦ 4+3 ¦ константа 7 ¦
¦ 4*3 ¦ константа 12 ¦
¦ 4*3+2*1 ¦ константа 14 ¦
¦ 4*(3+2)*1 ¦ константа 21 ¦
L--------------------+-------------------------------------------
В Приложении B содержится полная грамматика в форме Бэку-
са-Наура, используемая при синтаксическом анализе выражений в
режимах MASM и Ideal. Эта грамматика последовательно описывает
синтаксис выражений Турбо Ассемблера, а также старшинство опера-
ций.
Точность в выражениях
Турбо Ассемблер в режиме Ideal всегда использует 32-разряд-
ную арифметику. В режиме MASM Турбо Ассемблер использует 16- или
32-разрядную арифметику, в зависимости от выбора процессора
80386. Таким образом, некоторые выражения, в зависимости от того,
какой процессор выбирается, могут давать разные результаты. Нап-
ример, при вычислении:
(1000h * 1000h) / 1000h
получается 1000h при выборе процессора 80386 или 0 при выборе
процессоров 8086, 80186 или 80286.
Константы в выражениях
В качестве операндов в выражениях вы можете использовать
константы, например:
mov ax,5 ; "5" - это операнд-константа
Идентификаторы в выражениях
Когда вы используете в выражении идентификатор, возвращаемое
значение зависит от типа идентификатора. Вы можете использовать
идентификатор сам по себе или в сочетании с определенными унарны-
ми операциями, которые созданы для выделения другой информации из
величины, представляемой идентификатором.
41 ) Метка в языке ассемблера может содержать следующие символы:
Буквы: от A до Z и от a до z
Цифры: от 0 до 9
Спецсимволы: знак вопроса (?)
точка (.) (только первый символ)
знак "коммерческое эт" (@)
подчеркивание (_)
доллар ($)
Первым символом в метке должна быть буква или спецсимвол
near. Переход на такую метку возможен только в пределах того сегмента кода, в котором она описана
far. Переход на метку возможен в результате межсегментной передачи управления
Определить метку можно двумя способами:
с помощью директивы LABEL
с помощью оператора ":" (двоеточие).
Используя оператор ":", можно определить метку только ближнего типа (near). Например:
m:
mov eax,1
Используя оператор LABEL, можно определить метку любого типа. Например:
m label near
mov eax,1
или
m label far
mov eax,1
Применение меток оправдано во многих случаях. В одних лучше использовать метки ближнего типа, в других - дальнего. В следующих уроках мы рассмотрим эти случаи и научимся правильно выбирать тип метки.
Синтаксис команды безусловного перехода такой:
jmp [модификатор] адрес_перехода
Существует несколько кодов машинных команд, соответствующих JMP. Они отличаются дальностью перехода и способом задания целевого адреса. Операнд адрес_перехода может находиться в текущем сегменте(близкий переход) кода или в другом (дальний переход). Адресом перехода может являться имя метки:
jmp m
m:
mov eax,1
Есть еще такой вариант (указывается не адрес перехода, а место, где он хранится):
lea eax,m
jmp eax
m:
mov eax,1
Теперь перейдем к командам условного перехода. В таких командах решение о том, какая команда будет выполняться следующей, принимается в зависимости от некоторых условий, различных для разных команд перехода . Таких команд 18, они позволяют проверить:
отношение операндов со знаком (больше либо меньше)
отношение операндов без знака (выше или ниже)
состояние арифметических флагов ZF, SF, CF, OF, PF(но не AF)
Все команды условного перехода имеют одинаковый синтаксис:
jcc метка_перехода
Любая из них начинается с символа "j" (от слова jump), а вместо "cc" указывается конкретное условие, которое должна проанализировать программа. Метка перехода может находиться только в пределах текущего сегмента! Поэтому необходимость в модификаторе отпадает (всегда near). Условие обязательно должно быть сформировано до команды передачи управления. Его источником может служить любая команда, изменяющая состояние арифметических флагов или регистра ECX/CX.
В большинстве случаев Вы будете пользоваться командой CMP. Поэтому сейчас я немного расскажу вам о ней. Команда CMP производит практически те же действия, что и команда SUB, только она не записывает результат вычитания на место первого операнда, а просто устанавливает флаги (нас интересует флаг знака результата, и флаг нулевого результата). Вот ее синтаксис:
cmp операнд_1, операнд_2
Флаги, устанавливаемые командой CMP, можно проанализировать командами условного перехода. Понимание принципа формирования названий команд условного перехода облегчит их запоминание и дальнейшее практическое использование (см. табл. 1).
codesg segment
lodsw ; cчитать слово из строки,
cmp ax,7 ; если это 7 - выйти из цикла
codesg ends
имя - необязательный параметр. Имя (идентификатор) переменной может содержать цифры, буквы латинского алфавита, символ подчеркивания в любом порядке, но начинаться должно обязательно с буквы. Длина имени переменной допускается в MASM32 одиннадцатой версии до 247 символов включительно. Если значение переменной при старте программы не определено, вместо числа или символьного значения после указания типа записывают знак вопроса.
42)числа символьные данные
Данные – числа и закодированные символы, используемые в качестве операндов команд. Основные типы данных в ассемблере
Бит (bit) - двоичный разряд. Байт (byte) - последовательность из 8 бит. Слово (word) - последовательность из двух байт (16 бит). Двойное слово (double word) - последовательность из четырех байт (32 бита).
Символьные данные
Символьные данные задаются в кодах и имеют длину, как правило, 1 байт (для кодировки ASCII) или 2 байта (для кодировки Unicode)
