- •Вопросы к контрольной работе №3 Тема: «Цепочки, структуры, bcd»
- •Команды сканирование цепочки, формат, принцип работы.
- •Команды загрузки элемента из цепочки, формат, принцип работы.
- •Команды сохранения элемента в цепочке, формат, принцип работы.
- •Неупакованные bcd-числа, команда коррекции вычитания, принцип работы.
Команды сохранения элемента в цепочке, формат, принцип работы.
stos адрес_приемника (STOre String) — сохранить элемент из регистр-аккумулятора al/ax/eax в цепочке;
stosb (STOre String Byte) — сохранить байт из регистра аl в цепочке;
stosw (STOre String Word) — сохранить слово из регистра ах в цепочке;
stosd (STOre String Double Word) — сохранить двойное слово из регистра еах в цепочке.
Команда имеет один операнд адрес_приемника, адресующий цепочку в дополнительном сегменте данных. Работа команды заключается в том, что она пересылает элемент из аккумулятора (регистра eax/ax/al) в элемент цепочки по адресу, соответствующему содержимому пары регистров es:edi/di. При этом содержимое edl/di подвергается инкременту или декременту (в зависимости от состояния флага df) на значение, равное размеру элемента цепочки.
Команды получения элементов цепочки из порта ввода-вывода, формат, принцип работы.
ins адрес_приемника, номер_порта (Input String) — ввести элементы из порта ввода-вывода в цепочку.
insb (INput String Byte) — ввести из порта цепочку байтов;
insw (INput String Word) — ввести из порта цепочку слов;
Insd (INput String Double Word) — ввести из порта цепочку двойных слов.
Эта команда вводит элемент из порта, номер которого находится в регистре dx, в элемент цепочки, адрес которого определяется операндом адрес_приемника. Адрес должен быть явно сформирован в паре регистров es:edi/ di. Размер элементов цепочки должен быть согласован с размерностью порта. После пересылки команда ins производит коррекцию содержимого edi/di на величину, равную размеру элемента, участвовавшего в операции пересылки. Как обычно, при работе цепочечных команд учитывается состояние флага df.
Команды вывода элементов цепочки в порт ввода-вывода, формат, принцип работы.
outs номер_порта,адрес_источника(ОutPut String) — вывести элементы из цепочки в порт ввода-вывода
outsb (OUTput String Byte) — вывести цепочку байтов в порт ввода-вывода;
outsw (OUTtput String Word) — вывести цепочку слов в порт ввода-вывода;
outsd (OUTput String Double Word) — вывести цепочку двойных слов в порт ввода-вывода.
Эта команда выводит элемент цепочки в порт, номер которого находится в регистре dx. Адрес элемента цепочки определяется операндом адрес_источника. Значение адреса должно быть явно сформировано в паре регистров ds:esi/si. Размер структурных элементов цепочки должен быть согласован с размерностью порта. После пересылки команда outs производит коррекцию содержимого esi/si на величину, равную размеру элемента цепочки, участвовавшего в операции пересылки. При этом, как обычно, учитывается состояние флага df.
Префикс повторения rер.
Этот префикс используется с командами, реализующими
операции-примитивы пересылки и сохранения элементов цепочек, — соответственно, movs и stos. Префикс rер заставляет данные команды выполняться, пока содержимое в есх/сх не станет равным 0. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшает содержимое есх/сх на единицу. Та же команда, но без префикса, этого не делает.
Префиксы повторения rере или repz.
Эти префиксы являются абсолютными синонимами. Цепочечная команда выполняться до тех пор, пока содержимое есх/сх не равно нулю или флаг zf равен 1. Как только одно из этих условий нарушается, управление передается следующей команде программы. Благодаря возможности анализа флага zf наиболее эффективно эти префиксы можно использовать с командами cmps и scas для поиска отличающихся элементов цепочек.
Префиксы повторения rерnе или repnz.
Эти префиксы также являются абсолютными синонимами. Префиксы rерnе/repnz заставляют цепочечную команду циклически выполняться до тех пор, пока содержимое есх/сх не равно нулю или флаг zf равен нулю. При невыполнении одного из этих условий работа команды прекращается. Данные префиксы также можно использовать с командами cmps и scas, но для поиска совпадающих элементов цепочек.
Особенность формирования физического адреса операндов адрес_источника и адрес_приемника.
Полные физические адреса для операндов цепочечных команд следующие:
адрес__источника – пара ds:esi/si;
адрес_приемника – пара es:edi/di.
Отличие команд, реализующих цепочечные операции-примитивы, с явным указанием операндов от безоперандных команд.
При трансляции операндные команды преобразуются в одну из трех безоперандных команд: с суффиксами -b,-w и -d для цепочек байтов, слов и двойных слов соответственно. Решение о том, в какую конкретно команду будет произведено преобразование, принимается транслятором, исходя из размеров элементов цепочек, адреса которых указаны в качестве операндов. Далее будут проведены операции с элементами, находящимися по адресам esi/si или/и edi/di, и значения этих регистров затем будут откорректированы согласно с суффиксами -b,-w и -d. Т.о. в безоперандной команде размер элементов цепочки определяется программистом, а в операндной - трансятором.
Задание направление обработки цепочки.
Направление определяется значением флага направления df (Direction Flag) в регистре eflags/flags:
− если df=0, то значения индексных регистров esi/si и edi/di будут автоматически увеличиваться (обработка в направлении возрастания адресов). сld - установить df в 0.
− если df=1, то значения индексных регистров esi/si и edi/di будут автоматически уменьшаться (обработка в направлении убывания адресов). std - установить df в 1.
Структура, порядок использования структур в программе.
Для использования структур в программе необходимо выполнить три действия:
1. Задать шаблон структуры, т.е. определить новый тип данных, который впоследствии можно использовать для определения переменных этого типа.
2. Определить экземпляр структуры. Этот этап подразумевает инициализацию конкретной переменной с заранее определенной (с помощью шаблона) структурой.
3. Организовать обращение к элементам структуры.
Описание шаблона структуры.
Формат задания шаблона структуры:
имя_структуры STRUC
<описание полей>
имя_структуры ENDS
Здесь <описание полей> представляет собой последовательность директив описания данных db, dw, dd, dq и dt. Их операнды определяют размер полей и при необходимости начальные значения. Шаблон необходимо поместить в начале сегмента данных либо перед ним. Переменная типа структуры описывается в сегменте данных.
Определение данных с типом структуры.
[имя переменной] имя_структуры <[список значений]>
sotrl worker <”Гурко Андрей Вячеславович",, 'художник', '33', '15', '1800', '26.01.64'>
Если список указан не полностью, то все поля структуры для данной переменной инициализируются значениями из шаблона, если таковые заданы. Допускается инициализация отдельных полей, но в этом случае пропущенные поля должны отделяться запятыми.
Методы работы со структурой.
адресное__выражение.имя_поля_структуры
Здесь:
адреснов_выражение —
идентификатор переменной некоторого
структурного типа или выражение в
скобках;
имя_поля_структуры — имя поля из шаблона структуры. Это на самом деле тоже адрес, а
точнее, смещение поля от начала структуры. Таким образом оператор . вычисляет выражение: (адресное_выражение) + (имя_поля_структуры)
Определение объединения, шаблон описания.
Объединение — тип данных, позволяющий трактовать одну и ту же область памяти как имеющую разные типы и имена.
имя_объедннения UNION
<описание полей>
имя_объединения ENDS
Отличие объединений от структур состоит, в том, что при определении переменной типа объединения память выделяется в соответствии с размером максимального элемента. Одновременная работа с элементами объединения исключена.
Определение записи, шаблон описания.
Запись — структурный тип данных, состоящий из фиксированного числа элементов длиной от одного до нескольких бит.
имя_записи RECORD <описание элементов>
Здесь:
<описание элементов>
представляет собой последовательность
описаний отдельных элементов записи.
Имя_ записи record имя_поля:размер[=значение] [,имя_поля:размер[=значение]]
Определение экземпляра записи.
iotest record i1:1, i2:2=11, i3:1, i4:2=11, i5:2=00
flag iotest ? ;все элементы обнуляются
flag iotest <> ;согласились со значением по умолчанию
flag iotest <, 10,> ; переопределили i2
flag iotest {i2=10}; переопределили i2
Оператор width.
Позволяет узнать размер элемента записи в битах или полностью размер записи. Варианты применения оператора width:
width имя_элемента_записи — значением оператора будет размер элемента в битах;
width имя_экземпляра_записи или width имя типа_записи — значением оператора будет размер всей записи в битах.
mov al,width i2
mov ax,width iotest
Команда setfield, синтаксис, назначение.
Для установки значения некоторого поля записи используется команда setfield с синтаксисом setfield имя_элемента_записи назначение, регистр_источник
Обрабатывая данную команду, транслятор генерирует последовательность ко-
манд, которые выполняют следующие действия:
1. сдвиг содержимого регистр_источник влево на количество разрядов, соответствующее расположению элемента в записи;
2. логическую операцию оr над операндами назначением регистр_источник. Результат операции помещается в операнд назначение.
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
.....
flag iotest <>
....
mov al,flag
mov bl,3
setfield i5 al,bl
Команда getfield, синтаксис, назначение.
Для выборки значения некоторого поля записи используется команда getfield с синтаксисом getfield имя_элемента_записи регистр_назначение, источник. Обратно setfield.
В качестве операнда источник может быть указан либо регистр, либо адрес памяти. В регистр, указанный операндом регистр__назначение, помещается результат работы команды — значение элемента записи. Команда getfield всегда использует 16-битный регистр, даже если вы укажете в этой команде имя 8-битного регистра.
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
.....
flag iotest <>
....
mov al,flag
xor bl,bl
getfield i5 bl,al
mov bl,1
Целые двоичные числа, определение, директивы описания.
Это число, закодированное в двоичной системе счисления. Размерность целого двоичного числа может составлять 8, 16 или 32 бита. Знак двоичного числа определяется тем, как интерпретируется старший бит в представлении числа. Это 7-й, 15-й или 31-й биты для чисел соответствующей размерности. Среди арифметических команд есть всего две команды, которые действительно учитывают этот старший разряд как знаковый, — это команды целочисленного умножения и деления imul и idiv.
Числа с фиксированной точкой в программе описываются с использованием директив db, dw и dd.
Десятичные числа, определение, директивы описания, форматы.
Десятичные числа — специальный вид представления числовой информации, в основу которого положен принцип кодирования каждой десятичной цифры числа группой из четырех бит. При этом каждый байт числа, содержит одну или две десятичные цифры в так называемом двоично-десятичном коде (BCD — Binary Coded Decimal). Микропроцессор хранит BCD-числа в двух форматах (рис. 8.3):
− упакованный формат — каждый байт содержит две десятичные цифры.
− неупакованный формат — каждый байт содержит одну десятичную цифру в четырех младших битах.
Команды сложения двоичных чисел inc, add, adc.
inc операнд — операция инкремента, то есть увеличения значения операнда на 1;
add операнд_1,операнд_2 — команда сложения с принципом действия:
операнд_1 = операнд_1 + операнд_2;
adc операнд_1,операнд_2 — команда сложения с учетом флага переноса cf. Принцип действия команды:
операнд_1 = операнд_1 + операнд_2 + значение флага переноса cf.
xоr ах,ах
add al,17
add al, 254
jnc ml ;если нет переноса, то перейти на ml
adc ah, 0 ;в ах сумма с учетом переноса
Команды вычитания двоичных чисел dec, sub, sbb.
dec операнд — операция декремента, то есть уменьшения значения операнда на 1;
sub оперднд_1,операнд_2 — команда вычитания; ее принцип действия:
операнд_1 = операнд_1 - операнд_2;
sbb операнд_1,операнд_2 — команда вычитания с учетом заема (флага cf):
операнд_1 = операнд_1 - операнд_2 – значение_сf
хоr ах,ах
mov al,5
sub al, 10
jnc ml ;нет переноса?
neg a1 ;в al модуль результата
ml: ...
Команды умножения двоичных чисел mul, imul.
mul сомножитель_1
В команде указан всего лишь один операнд-сомножитель. Второй операнд-сомножитель_2 задан неявно. Его местоположение фиксировано и зависит от размера сомножителей. Произведение состоит из двух частей и в зависимости от размера операндов размещается в двух местах — в al,ax,eax(младшая часть) и в дополнительных регистрах ah, dx, edx (старшая часть).
хоr ах,ах
mov al,25
mul rez_1
jnc ml ;если нет переполнения то, на m1
mov rez_h,ah ;старшую часть результата в rez_h
ml:
mov rez_l, al
imul операнд_1[,операнд_2,операнд_3]
Если результат мал и умещается в одном регистре, то все его биты равны старшему биту (знаковому разряду) младшей части результата. В противном случае (если cf = of = 1) знаком результата является знаковый бит старшей части результата, а знаковый бит младшей части является значащим битом двоичного кода результата.
Команды деления двоичных чисел div, idiv.
div делитель
Делитель может находиться в памяти или в регистре и иметь размер 8, 16 или 32 бит. Местонахождение делимого фиксировано и так же, как в команде умножения, зависит от размера операндов. Результатом команды деления являются значения частного и остатка.
Делимое ax ax,dx eax,edx
Делитель байт слово двойное слово
Частное al ax eax
Остаток ah dx edx
При idiv учитывается знак.
Команды преобразования типов cbw, cwd.
cbw (Convert Byte to Word) — команда преобразования байта (в регистре al) в слово (в ре-
гистре ах) путем распространения значения старшего бита al на все биты регистра ah; cwd (Convert Word to Double) — команда преобразования слова (в регистре ах) в двойное
слово (в регистрах dx:ax) путем распространения значения старшего бита ах па все биты регистра dx;
Команды преобразования типов cwde, cdq.
cwde (Convert Word to Double) — команда преобразования слова (в регистре ах) в двойное слово (в регистре еах) путем распространения значения старшего бита ах на все биты старшей половины регистра еах;
cdq (Convert Double Word to Quarter Word) — команда преобразования двойного слова (в
регистре еах) в учетверенное слово (в регистрах edxeax) путем распространения значения старшего бита еах на все биты регистра edx;
Команды movsx и movzx.
movsx операнд_1, операнд_2 — переслать с распространением знака. Расширяет 8- или 16-разрядное значение операнд_2, которое может быть регистром или операндом в памяти, до 16- или 32-разрядного значения в одном из регистров, используя значение знакового бита для заполнения старших позиций операнд_1. Данную команду удобно использовать для подготовки операндов со знаками к выполнению арифметических действий;
movzx операнд_1, операнд_2 — переслать с расширением нулем. Расширяет 8- или 16-разрядное значение операнд_2 до 16- или 32-разрядного с очисткой (заполнением) нулями старших позиций операнда. Данную команду удобно использовать для подготовки операндов без знака к выполнению арифметических действий.
Команды xadd, neg.
xadd назначение, источник — обмен местами и сложение. Команда позволяет выполнить последовательно два действия:
− обменять значения назначение и источник,
− поместить на место операнда назначение сумму: назначение = назначение + источник.
neg операнд — отрицание с дополнением до двух. Команда выполняет инвертирование значения операнд. Физически команда выполняет одно действие: операнд = 0 – операнд, то есть вычитает операнд из нуля.
Неупакованные BCD-числа, команда коррекции сложения, принцип работы.
ааа (ASCII Adjust for Addition) — коррекция результата сложения для представления в символьном виде. Работает неявно только с регистром al и анализирует значение его младшей тетрады. Если это значение меньше 9, то флаг cf сбрасывается в 0, и осуществляется переход к следующей команде. Если это значение больше 9, то выполняются следующие действия:
− к содержимому младшей тетрады al (но не к содержимому всего регистра!) прибавляется 6, тем самым значение десятичного результата корректируется в правильную сторону;
− флаг cf устанавливается в 1, тем самым фиксируется перенос в старший разряд для того, чтобы его можно было учесть в последующих действиях.
