Контрольные работы, курсовые, дипломные, рефераты, а также подготовка докладов, чертежей, лабораторных работ, презентаций и еще много всего. Недорого и быстро.

Узнать больше...

Главная страница Шпаргалки
Решение задач Эксклюзивные фото по химии
Сочинения (более 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) увеличение операнда на 1

DEC op ; (decrement) уменьшение операнда на 1

NEG 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,1

neg 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,op3

op1:=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 или переполнение» в случаях:

делитель равен 0 (op=0)

неполное частное не вмещается в отведенное ему место (600/2).

При такой ошибке ПК прекращает выполнение программы.

3.6.4. Изменение размера числа

Пусть к числу из регистра ВХ нужно прибавить число из AL. Но команды сложения слова с байтом в ПК нет. Размеры этих чисел необходимо сделать равными, расширить байт до слова, записав его, например в АХ.

Если число трактуется как беззнаковое, то надо слева приписать нули, присвоив AH:=00. Для чисел со знаком необходимо приписывать 0FFh.

Команда расширения:

CBW (convert byte to word) расширение байта до слова.

Операнд всегда берется из AL, а результат всегда записывается в АХ, то есть

. Флаги команда не меняет.

 

 

Вы находитесь на сайте Xenoid v2.0:
если вам нужно быстро, подробно и недорого
решить контрольную - обращайтесь. Возможны консультации
онлайн. См. раздел "Решение задач".

oneplus купить

 

 

 

Copyright © 2005-2013 Xenoid v2.0

Использование материалов сайта возможно при условии указания активной ссылки
Химия: решение задач