Флаги регистра eflags/flags можно разделить на три группы. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Флаги регистра eflags/flags можно разделить на три группы.



· 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд;

· 1 флаг направления. Обозначается как df (Directory Flag). Используется цепочечными командами;

· 8 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.


Таблица 2.1. Флаги состояния

Мнемоника флага Флаг в eflags Номер бита Содержание и назначение
Cf Флаг переноса (Carry Flag)   1, если арифметическая операция произвела перенос из старшего бита результата. Старшим является 7-й, 15-й или 31-й бит в зависимости от размерности операнда; 0 - переноса не было
Pf Флаг чётности (Parity Flag)   1, если 8 младших разрядов (этот флаг - только для 8 младших разрядов операнда любого размера) результата содержат четное число единиц; 0, если 8 младших разрядов результата содержат нечетное число единиц
af Вспомогательный флаг переноса (Auxiliary carry Flag)   1, если в результате предыдущей операции произошёл перенос (или заём) из третьего бита в четвёртый. Используется командами двоично-десятичной коррекции
zf Флаг нуля (Zero Flag)   1, если результат нулевой; 0, если результат ненулевой
sf Флаг знака (Sign Flag)   1, если старший бит результата равен 1; 0, если старший бит результата равен 0
of Флаг переполнения (Overflow Flag)   Флаг of используется для фиксирования факта потери значащего бита при арифметических операциях: 1, если в результате операции происходит перенос (заем) в (из) старшего, знакового бита результата (биты 7, 15 или 31 для 8-, 16- или 32-разрядных операндов, соответственно); 0, если в результате операции не происходит переноса (заема) в (из) старшего, знакового бита результата
iopl Уровень привилегий ввода-вывода (Input/Output Privilege Level) 12, 13 Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода
nt Флаг вложен ности задачи (Nested Task)   Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую

Таблица 2.2. С истемные флаги

Мнемоника флага Флаг в eflags Номер бита Содержание и назначение
tf Флаг трассировки (Trace Flag)   Если 1 - микропроцессор генерирует прерывание с номером 1 после выполнения каждой машинной команды.
if Флаг прерывания (Interrupt enable Flag)   Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний. 1 - аппаратные прерывания разрешены; 0 - аппаратные прерывания запрещены
rf Флаг возобновления (Resume Flag)   Используется при обработке прерываний от регистров отладки
vm Флаг виртуального 8086 (Virtual 8086 Mode)   1 - процессор работает в режиме виртуального 8086; 0 - процессор работает в реальном или защищенном режиме
ac Флаг контроля выравнивания (Alignment Check)   Предназначен для разрешения контроля выравнивания при обращениях к памяти. Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам, кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию.    
Vif Флаг виртуального прерывания (Virtual Interrupt Flag)   При определенных условиях (одно из которых - работа микропроцессора в V-режиме) является аналогом флага if. Флаг vifиспользуется совместно с флагом vip. Флаг появился в микропроцессоре Pentium
vip Флаг отложенного виртуального прерывания (Virtual Interrupt Pending flag)   Устанавливается в 1 для индикации отложенного прерывания. Используется при работе в V-режиме совместно с флагом vif. Флаг появился в микропроцессоре Pentium
Id Флаг идентификации (Identification flag)   Используется для того, чтобы показать факт поддержки микропроцессором инструкции cpuid,с помощью которой можно "запросить" у процессора его идентификатор CPUID.

 


Данные в ассемблере

Секции.data,.data? и.const нужны для определения данных программы. Место под данные резервируется с помощью директив db, dw, dd, dq, dt.

 

Db - 1 байт

Dw - 2 байта - 1 слово

Dd - 4 байта - 2 слова

Dq - 8 байт - 4 слова

Dt - 10 байт

 

Все данные из секции.data включаются в исполнимый файл. В секции.data? данные нельзя инициализировать. Все данные в этой секции не включаются в исполнимый файл. Секция.const предназначена только для чтения. При попытке изменить эти данные ошибок не возникает.

.data

Perem dd 0000FF11h;0000 0000 0000 0000 1111 1111 0001 0001

X1 dw 01235h;0001 0010 0011 0101

Binary db 00111010b;00111010

decimal dw 28d;0001 1100

large dq 01123456789ABCDEFh;0001 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

.data?

Perem1 dd? 0000 0000 0000 0000 0000 0000 0000 0000

Perem2 dq? 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Perem5 dw? 0000 0000 0000 0000

Dd? 0000 0000 0000 0000 0000 0000 0000 0000

Dw? 0000 0000 0000 0000

Perem4 db? 0000 0000

.const

Const1 dd 012345678h 0001 0010 0011 0100 0101 0110 0111 1000

dw 768d 0000 0011 0000 0000

 


Строки.

В ассемблере можно задавать только ANSI строки, Unicode строки сложнее задавать и для их обработки существует целый ряд API функций.

Первой известной кодировкой символов была кодировка ASCII, и она используется до сих пор. В ASCII-кодировке каждый символ занимает 8 бит, или один байт.

2) Международная организация по стандартизации ISO (International Standards Organization) создала новый стандарт кодировки символов, названный Latin-1, который содержал европейские символы, не вошедшие в набор ASCII.

3) Microsoft расширила Latin-1 и назвала этот стандарт ANSI. ANSI 8-битная кодировка, которая может представлять только 256 уникальных символов.

4) Microsoft в сотрудничестве с Apple Computer, Inc., и IBM создала некоммерческий консорциум Unicode, целью которого стало определение нового стандарта на кодировку символов для международных наборов символов. Работа, проделанная в Unicode, была объединена с работой, которая велась в ISO, и их результатом работы стал стандарт Unicode для кодировки символов. Unicode является 16-разрядным стандартом, что обеспечивает 65 536 уникальных символов - более чем достаточно для представления всех языков мира.

5) Родной кодировкой для Windows является Unicode, но она поддерживает и ANSI. ОС представляет имена объектов, пути и имена файлов в виде 16-битных символов Unicode. Она также использует Unicode для хранения данных в реестре.

Если программа сохраняет текст Jerry с использованием ANSI, то он будет выглядеть в памяти как:

0×4А 0×65 0×72 0×72 0×79.

Если программа сохраняет этот же текст с использованием Unicode, то он будет выглядеть как:

0×00 0х4А 0×00 0×65 0×00 0×72 0×00 0×72 0×00 0×79.

 


При присваивании однобайтовой переменной некоторого символа, то эта переменная будет равна коду символа в кодировке ANSI. При инициализации символа можно использовать и кавычки и апострофы - без разницы.

 

Data

Char1 db 'W'

Char2 db 'Й'

db "r"

Тоже самое:

Data

Char1 db 57h

Char2 db 0C9h

Db 72h

 

Объявлять строки можно и следующим образом:

String db "ASM"

Тоже самое:

String db 'A'

Db "S"

Db "M"

Тоже самое:

String db 41h

Db 53h

Db 4Dh

Тоже самое:

String db 41h, 53h, 4Dh

 

При передаче строк функциям в качестве параметров надо чтобы в конце строки был 0, для того чтобы функция смогла найти конец строки.

String db "ASM",0h

Msg db "First ASSEMBLER program",0h

Ttl db 'Hello, World!!!!',0h

 


Заполнение данными.

Если нужно описать много одинаковых переменных, например 30 переменных, то это можно сделать так:

Db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 30 раз

Но можно это сделать с помощью директивы DUP.

Db 30 DUP (0); тот же результат

 

в скобках указываем, чем надо заполнять, можно использовать символы в кавычках. Обязательно чтобы размер в скобках совпадал с директивой.

 

Примеры:

Dd 10 DUP ("в") 00 00 00 A2 00 00 00 A2 00 00 00 A2 00 00 00 A2 00 00 00 A2 00 00 00 A2 00 00 00 A2 00 00 00 A2 00 00 00 A2 00 00 00 A2

Dw 45h DUP (0DF23h); 69 повторений DF23

Dd 100b DUP (12345678h); 4 повторения 12345678h 12345678h 12345678h 12345678h

 


Операнды языка Ассемблер

Операнды – это объекты (некоторые значения, регистры или ячейки памяти), на которые действуют инструкции или директивы, либо это объекты, которые определяют или уточняют действие инструкций или директив.

Классификация операндов:

1. Постоянные или непосредственные операнды – число, строка, имя или выражение, имеющие некоторое фиксированное значение. Имя не должно быть перемещаемым, то есть зависеть от адреса загрузки программы в память. Оно может быть определено операторами equ или =.

Num equ 5

imd = num-2

Mov al,num; эквивалентно mov al,5: 5 здесь непосредственный операнд

add [si],imd; imd=3 – непосредственный операнд



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 497; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.156.156 (0.017 с.)