Контрольные работы, курсовые, дипломные, рефераты, а также подготовка докладов, чертежей, лабораторных работ, презентаций и еще много всего. Недорого и быстро.
Главная страница | Шпаргалки |
Решение задач | Эксклюзивные фото по химии |
Сочинения (более 4000) | Юмор из жизни учащихся |
Вернуться в раздел "Учебные материалы" |
Информатика и Ассемблер
ГЛАВА
3ПЕРЕСЫЛКИ. АРИФМЕТИЧЕСКИЕ КОМАНДЫ
3
.1. Обозначения операндов командПри описании команд необходимо указывать, какие операнды в них допустимы, а какие - нет. Для сокращения, примем следующие условные обозначения.
Местонахождение операнда |
Обозначение |
Запись в ЯА |
в команде |
i8 , i16, i32 |
конст. выражение |
в РОН |
r8 , r16, (r32) |
имя регистра |
в сегментном регистре |
sr |
cs ,ds,ss,es |
в ячейке памяти |
m8 , m16, m32 |
адресное выражение |
Непосредственные операнды, то есть задаваемые в самой команде обозначим буквой
i ( от immediate - непосредственный), указывая за ней, сколько разрядов - 8,16 или 32 - отводится на него по команде. Число может быть меньше, но не больше отведенного числа разрядов.Регистры обозначаются
r - register и указание размера регистра r8 - байтовые регистры(ah,cl) r16 - регистры, размером в слово (ax,si) [r32], sr - отдельно.Если операнд находится в памяти, то указывается адрес соответствющей ячейки. Обозначается
m и указывается размер ячейки. Такие операнды называют адресными выражениями.3
.2. Команды пересылки3
.2.1. Команда MOVВ
8086 есть команды пересылки байта или слова (dw - одной командой нет). Епресылаемая величина берется из команды, регистра или ячейки памяти и записывается в рагистр или ячейку памяти. Таких команд много но в ЯА они записываются одинаково mov op1,op2. Ассемблер сам выбирает нужную машинную команду в зависимости от вида операндов. По команде на место первого операнда пересылается значение второго: op1:=op2. Регистр флагов команда не меняет. Mov bx,777 mov cl,bh. В команде mov допустимы следующие комбинации операндов:
op1 |
op2 |
|
r8 |
i8 ,r8,m8 |
пересылка |
m8 |
i8 ,r8 |
байтов |
r16 |
i16 ,r16,sr,m16 |
пересылка |
sr (but cs) |
r16 ,m16 |
слов |
m16 |
i16 ,r16,sr |
Из таблицы видно, что запрещены пересылки из одной ячейкипамяти в другую, из одного сегментного регистра в другой, непосредственного операнда в сегментный регистр. Таких команд нет. Реализуются в две команды например
mov ax,22 mov ds,ax ;ds:=22. Нельзя менять cs! Mov переворачивает числа. N dw 1234h ; n 34h n+1 12h ... mov ax,q ;ah 12h.Определение размера пересылаемых величин:
x db ? y db ? mov bh,0 mov x,0 mov si,0 mov y,0. 0 это 00Н или 0000Н. Если не совпадают - ошибка.3.3. Команды сложения и вычитания
3
.3.1.Команды ADD и SUBВ ПК имеются несколько команд сложения и вычитания. Основные:
сложение ADD op1,op2
вычитание
SUB op1,op2 ;subtractВ этих командах допустимы следующие комбинации операндов:
op1 |
op2 |
|
r8 |
i8 ,r8,m8 |
сложение/вычитание |
m8 |
i8 ,r8 |
байтов |
r16 |
i16 ,r16,m16 |
сложение/вычитание |
m16 |
i16 ,r16 |
слов |
Команда
ADD складывает операнды и записывает их сумму на место первого операнда op1:=op1+op2. Например add ch,22;sub si,x;add ax, -300. Команды ADD и SUB работают как с числами размером в байт, так и с числами размером в слово. нельзя, чтобы один операнд был размером в байт, другой в слово.3
.3.2. Особенности сложения и вычитания чисел.Могут возникать ситуации, когда например в ячейке, размером в байт складываются числа
250 и 10, получается число 260 (100000100b), которое не «влезает» в ячейку. В этом случае левая единица отбрасывается и в качестве ответа выдается искаженная сума (в приведенном примере - число 4) но в флаг переноса CF записывается 1. Это признак получения неправильного результата (если переноса не было то в CF заносится 0). Затем можно проанализировать этот флаг и отловит подобную ошибку. Суммирование с отбрасыванием единицы переноса называется суммированием по модулю 2к k - размер ячейки. При этом в cf фиксируется был ли перенос.x
+у, если х+у< 2k , cf=0Сумма (х,у)=(х+у)
mod 2k= x+у-2k, если х+у< 2k , cf=1Аналогичная проблема возникает при вычитании беззнаковых х-у, если х<
y. При этом происходит следующее. Числу x дается заем, единицы, то есть к числу x прибавляется 2k и только после этого производится вычитание. Например при k=8 вычитание 1-3 осуществляется так.1
-3=(28+1)-3=(256+1)-3=257-3=254 то есть замена 0000001b на 1000001b.x
-у, если х>=у , cf=0Разность (х,у)=(х-у)
mod 2k= (2k+x)-y если х<у, cf=1Таким образом сложение и вычитание беззнаковых чисел производится по модулю
2k, а установленный флаг переноса свидетельствует о неправильности результата.Знаковые числа складываются и вычитаются по алгоритму беззнаковых чисел. Дополнительные коды знаковых операндов рассматривают как числа без знака и в таком виде складывают или вычитают, а полученный результат рассматривают как дополнительный код знакового ответа. Например. При байтовой ячейке. Надо сложить +
3 и -1 их дополнительные коды 3 и (256-1)=255. Складываем их как числа без знака 3+255 (mod 256)=258 (mod 256)=2. Далее величина 2 рассматривается как дополнительный код, то есть +2. Пример. Сложить -3 и +1. Дополнительные коды этих знаковых чисел (256-3)=253 и 1. Складываем их как беззнаковые числа. 253+1 (mod 256) =254. В дополнительном коде результат =-2 (254=256-2). Следовательно для сложения и вычитания беззнаковых и знаковых чисел не нужны разные машинные коды.Однако при ячейке размером
8 битов в дополнительном коде представляются числа 0т -128 до 127. Рассмотрим сложение чисел +127 и +2. Складывая их как беззнаковые 127 и 2 получаем 129, дополнительный код которой 129=256-127, суммой должно быть признано число -127! Складывая положительные числа получаем отрицательное.Почему так получилось? В дополнительном коде левый разряд является знаковым.
129=10000001b модуль которого не вмещается в 7 разрядов и «залез» в знаковый разряд, изменив его на противоположный. Такое налезание модуля числа на знаковый разряд называют «переполнением мантиссы». Возникает при сложении и вычитании знаковых чисел, при выходе результата за границы диапазона знаковых чисел. Фиксируется в флаге переполнения OF. При переполнении мантиссы флаг устанавливается. OF=0 - результат правильный, OF =1 - неправильный. Оба флага изменяются и программист отслеживает необходимый.Меняются также
ZF - значение 1,если результат нулевой, иначе флаг сброшен и sf, куда заносится знаковый бит.В итоге могут меняться флаги
CF,OF,SF,ZF а также AF и PF.3
.3.3. Команды INC, DEC и NEG.INC
op ; (increment) увеличение операнда на 1DEC
op ; (decrement) уменьшение операнда на 1NEG
op ; (negative) изменение знакаЗдесь допустимы типы операнда:
r8, m8, r16, m16. Например: inc ax, inc ch, dec word ptr year. Команда inc аналогична команде add op,1, а команда dec - sub op,1, с той разницей, что эти команды не меняют флаг переноса CF. Занимают меньше места в памяти и выполняются быстрее. Команда neg рассматривает операнд как число со знаком и меняет его на противоположный op:=-op. Например:mov
dl,1neg
dl ; dl:=-1 (0FFh)Флаги:
CF=1; OF=0; ZF, SF - меняются как обычно. Если операнд нулевой, то CF=0. Исключение. При byte ptr оp=-128 (80h) операнд не изменяется, так как нет знакового числа +128 (тоже при word ptr оp=-32768 (8000h)). Здесь OF=1.3
.3.4. Команды ADC и SBB.ADC
op1,op2 ; (add with carry): сложение с учетом переноса.SBB
op1,op2 ; (subtract with carry): вычитание с учетом переноса.Выполняют действия операторов
add и sub, и дополнительно к сумме операндов прибавляется значение флага переноса CF - по команде ADC op1:=op1+op2+CF, и из разности операндов вычитается CF - op1:= op1+op2+CF для sbb. Используется для сложения чисел больших чем слово.3
.4. Команды умножения и деления.3
.4.1. Команды умножения.MUL
op (multiply) умножение целых без знака.IMUL
op (integer multiply) умножение целых со знаком.Умножение байтов:
AX:=AL*op (op:r8,m8)Умножение слов: (
DX,AX):=AX*op (op:r8,m8)Операнд, указываемый в команде - это один из сомножителей, он может находится в регистре или в памяти, но не может быть непосредственным операндом. Местонахождение другого сомножителя фиксировано и потому не указывается в команде явно: при умножении байтов он берется из регистра
AL, а при умножении слов - из AX. Местонахождение результата также известно и в команде явно не указывается. Под результат отводится в два раза больше места чем под сомножитель. При умножении байтов результат имеет размер слова и помещается в регистр AX (AH - старшая часть, AL - младшая), при умножении слов результат имеет размер двойного слова и заносится в два регистра DX - старшие цифры произведения, в AX - младшие. Примеры x db 10 ... mov al,26 mul x ;ax=26*10=104h ah=10h, al=04h mov ax,8 mov bx, -1 imul bx ;(dx,ax)=-8=0FFFFFFF8h dx=0FFFFh ax=0FFFFh;Флаги
CF и OF меняются синхронно:CF
=OF=1 - если произведение имеет двойной форматCF
=OF=0 - если произведению достаточен формат сомножителей.3
.4.2. Умножение на процессорах 80186 и старшеВ процессоре
80186 была введена команда умножения с тремя операндами:MUL
op1,op2, op3 или IMUL op1,op2,op3op1
:=op2*op3. Допустимые типы операндов: op1:r16 op2:r16,m16 op3:i16. Например mul si,dx,40. Результат и операнды имеют размер слова, поэтому если флаги CF=OF=0 то результат поместился в регистр-слово, а если CF=OF=1, то старшая часть утеряна и результат неверен. Если первый сомножитель берется из регистра в который должен быть записан результат, то в команде этот регистр может быть указан однажды. MUL op1,op3 (IMUL op1,op3) mul dx,35.По умолчанию ассемблер воспринимает только команды
8086 процессора. Чтобы ассемблер правильно воспринимал команды 80186 процессора необходимо в любом месте программы (но до первой такой команды) указать директиву .186 (для 80286 -.286, для 80386 - .386, для 80486 - .486).3
.4.3. Команды деленияДеление чисел без знака и со знаком реализуется командами
DIV
op (divide) деление целых без знакаIDIV
op (integer divide) деление целых со знакомделение слова на байт:
AH
:= AX mod op, AL:=AX div op (op:r8,m8)деление слова на слово:
DX
:=(DX,AX) mod op, AX:=(DX,AX) div op (op:r16,m16)В командах местонахождение первого операнда (делимого) фиксировано и явно не указывается. Под делением понимают получение двух величин - неполного частного (
div) и остатка (mod). Оба числа помещаются на место делимого - старшая часть заменяется на остаток, младшая - на неполное частное. Имеют размер, совпадающий с делителем.Если
trunc - отбрасывание дробной части, тоa
div b = trunc(a/b)a
mod b = a-b*(a div b)13
div 4 = 3 13 mod 4 = 1При выполнении команды деления возможно появление ошибки «деление на
0 или переполнение» в случаях:делитель равен
неполное частное не вмещается в отведенное ему место (
600/2).При такой ошибке ПК прекращает выполнение программы.
3
.6.4. Изменение размера числаПусть к числу из регистра ВХ нужно прибавить число из
AL. Но команды сложения слова с байтом в ПК нет. Размеры этих чисел необходимо сделать равными, расширить байт до слова, записав его, например в АХ.Если число трактуется как беззнаковое, то надо слева приписать нули, присвоив
AH:=00. Для чисел со знаком необходимо приписывать 0FFh.Команда расширения:
CBW
(convert byte to word) расширение байта до слова.Операнд всегда берется из
AL, а результат всегда записывается в АХ, то есть
|
Вы находитесь на сайте Xenoid v2.0: |
|
Copyright © 2005-2013 Xenoid v2.0
Использование материалов сайта возможно при условии указания активной ссылки
Химия: решение задач