лаб 3 по системному

Міністерство освіти і науки України

Одеський державний екологічний університет

Кафедра інформаційних технологій

ПРОТОКОЛ ЛАБОРАТОРНОЇ РОБОТИ №2

з системного програмування та операційних систем

тема або назва лабораторної роботи: Множення та додавання 16ти та 32х розрядних чисел

виконав студент групи К-33_ Фоменко В.В.

Оцінка за підготовку до роботи

(теоретична частина)

Оцінка за виконання роботи

(практична частина)

Оцінка за захист роботи

(остаточна, загальна кількість балів)

Одеса 2010

Задание к лабораторной работе

По приведенному алгоритму произвести сложение двух 16 разрядных чисел

с получением 32 разрядного результата

1. Очистить счетчик переносов

2. Занести первое слагаемое в сумматор

3. Прибавить к сумматору второе слагаемое

4. Если есть перенос выполнить п. 5 иначе п. 6

5. Увеличить счетчик переносов

6. Закончить вычисления

Сложение двух 32 разрядных числа с получением 32 разрядного результа-

та произвести по алгоритму:

1. Сложить младшие слова чисел

2. Операцией сложения с учетом переноса сложить старшие слова слагаемых

По алгоритму умножения двоичных чисел в столбик, произвести умножение

двух 16 разрядных чисел с получением 32 разрядного результата

1. Обнулить сумматор

2. Указатель бита установить в 1

3. Если соответствующий бит множителя равен 1 выполнить п. 4 иначе п. 5

4. Увеличить сумму на множимое

5. Сдвинуть сумму на один разряд вправо

6. Сдвинуть вправо указатель бита

7. Если бит не последний выполнить пункт 3

8. Закончить вычисления

Проделать умножение этих же чисел с помощью операции умножения и

сравнить результаты

Теоретическая часть

(ADDition) Сложение

Схема команды: 

add приемник,источник 

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

Алгоритм работы:

сложить операнды источник и приемник;

записать результат сложения в приемник;

установить флаги.Команда add используется для сложения двух целочисленных операндов. Результат сложения помещается по адресу первого операнда. Если результат сложения выходит за границы операнда приемник (возникает переполнение), то учесть эту ситуацию следует путем анализа флага cf и последующего возможного применения команды adc. Например, сложим значения в регистре ax и области памяти ch. При сложении следует учесть возможность переполнения.

(SUBtract)Вычитание

Схема команды: 

sub операнд_1,операнд_2 

Назначение: целочисленное вычитание.

Алгоритм работы:

выполнить вычитание операнд_1=операнд_2-операнд_1;

установить флаги. Команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.

(MULtiply)Умножение целочисленное без учета знака

  Схема команды: 

mul множитель_1 

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

если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al;

если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax;

если операнд, указанный в команде — двойное слово, то второй сомножитель должен располагаться в eax.

Результат умножения помещается также в фиксированное место, определяемое размером сомножителей:

при умножении байтов результат помещается в ax;

при умножении слов результат помещается в пару dx:ax;

при умножении двойных слов результат помещается в пару edx:eax. Команда mul выполняет целочисленное умножение операндов без учета их знаковых разрядов. Для этой операции необходимо наличие двух операндов-сомножителей, размещение одного из которых фиксировано, а другого задается операндом в команде. Контролировать размер результата удобно используя флаги cf и of.

(DIVide unsigned)Деление беззнаковое

Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, который указывается в команде:

если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;

если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;

если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.

Команда выполняет целочисленное деление операндов с выдачей результата деления в виде частного и остатка от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.



(DECrement operand by 1) Уменьшение операнда на единицу

  Команда dec используется для уменьшения значения байта, слова, двойного слова в памяти или регистре на единицу. Команда не воздействует на флаг cf.

(INCrement operand by 1) Увеличить операнд на 1

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

XOR Логическое исключающее ИЛИ

выполнить операцию логического исключающего ИЛИ над операндами: бит результата равен 1, если значения соответствующих битов операндов различны, в остальных случаях бит результата равен 0;

записать результат сложения в приемник;

установить флаги.

Команда xor используется для выполнения операции логического исключающего ИЛИ двух операндов. Результат операции помещается в первый операнд. Эту операцию удобно использовать для инвертирования или сравнения определенных битов операндов.

Сдвиговые операции

    Биты, сдвиг логический, арифметический и циклический.     Функции сдвига (сдвиг логический операнда влево/вправо) SHL операнд, количество_сдвигов SHR операнд, количество_сдвигов SHL и SHR сдвигают биты операнда (регистр/память) влево или вправо соответственно на один разряд.     Указанное выше действие повторяется количество раз, равное значению второго операнда.     Это означает: сдвиг всех битов регистра al на 3 разряда вправо. Так что al станет 00001011. Биты слева заполняются нулями, а биты справа выдвигаются. Последний выдвинутый бит, становится значением флага переноса cf.     Бит переноса это бит флагового регистра процессора. Этот регистр не такой как eax или ecx, к которому вы можете непосредственно обращаться (хотя есть опкоды, которые это делают), его содержание, зависит от результатов многих команд. Флаг переноса это бит во флаговом регистре и что он может быть установлен (т.е. равен 1) или сброшен (равен 0).     Команда shl такая же, как и shr, но сдвигает влево. ; bl = 11100101 (двоичное) shl bl, 2     После выполнения команды регистр bl будет равен 10010100 (двоичное). Два последних бита заполнились нулями, флаг переноса установлен, потому, что последний выдвинутый слева бит был равен 1     Здесь есть еще два других опкода: (сдвиг арифметический операнда влево/вправо) SAL операнд, количество_сдвигов SAR операнд, количество_сдвигов     Команда SAL такая же, как SHL, а вот SAR не совсем такая, как SHR. Команда SAR также, как и SHR сдвигает все биты операнда вправо на один разряд, при этом выдвигаемый справа бит становится значением флага переноса cf. Обратите внимание: одновременно слева в операнд вдвигается не нулевой бит, как в SHR, а значение старшего бита операнда.

     Циклический сдвиг

rol операнд, количество_сдвигов ; циклический сдвиг операнда влево ror операнд, количество_сдвигов ; циклический сдвиг операнда вправо rcl операнд, количество_сдвигов ; циклический сдвиг операнда влево через флаг переноса rcr операнд, количество_сдвигов ; циклический сдвиг операнда вправо через флаг переноса      Циклический сдвиг напоминает смещение, выдвигаемые биты, снова вдвигаются с другой стороны:

Пример: команды ror (циклический сдвиг вправо)

 

 

бит7

бит6

бит5

бит4

бит3

бит2

бит1

бит0



выдвигается

Операнд

 

1

0

0

1

1

0

1

1

 

ror операнд,3

 

 

 

 

1

0

0

1

1

011

Результат

 

0

1

1

1

0

0

1

1

 

     Как видно из рисунка выше, биты вращаются, то есть каждый бит, который выталкивается снова вставляется с другой стороны. Флаг переноса cf содержит значение последнего выдвинутого бита.     RCL и RCR сдвигают все биты операнда влево (для RCL) или вправо (для RCR) на один разряд, при этом старший(для RCL) или младший(для RCR) бит становится значением флага переноса cf; одновременно старое значение флага переноса cf вдвигается в операнд справа(для RCL) или слева(для RCR) и становится значением младшего(для RCL) или старшего(для RCR) бита операнда. Указанные действия повторяются количество раз, равное значению второго операнда.     ROL и ROR сдвигают все биты операнда влево(для ROL) или вправо(для ROR) на один разряд, при этом старший(для ROL) или младший(для ROR) бит операнда вдвигается в операнд справа(для ROL) или слева(для ROR) и становится значением младшего(для ROL) или старшего(для ROR) бита операнда; одновременно выдвигаемый бит становится значением флага переноса cf. Указанные действия повторяются количество раз, равное значению второго операнда.

Листинг программы:

.model small

.stack 100h

.data

word1 dw 5

word2 dw 3

summ dw 0

cout dw 0

.code

mov ax, @data

mov ds,ax

mov ax,word1

add ax,word2

mov summ,ax

mov ax,word1

add ax,word2

mov summ,ax

jnc Label1

inc cout

Label1:

mov ah,4ch

int 21h

end

.model small

.stack 100h

.data

word1 dd 56

word2 dd 37

summ dd 0

cout dw 0



.code

mov ax, @data

mov ds,ax

mov ax,word ptr word1

add ax,word ptr word2

mov word ptr summ,ax

mov ax,word ptr word1+2

adc ax,word ptr word2+2

mov word ptr summ+2,ax

mov ah,4ch

int 21h

end

.model small

.stack 100h

.data

word1 dw 5

word2 dw 3

summ dw 0

cout dw 0

.code

mov ax, @data

mov ds,ax

mov cx,word1

mov ax,word2

mov bx,1

Label 1:

test ax,bx

jne Label2

add summ,cx

Label2:

rol word ptr summ+2,1

rol word ptr summ,1

shl bx,1

jnc Label1

mov ah,4ch

int 21h

end



Страницы: 1 | 2 | Весь текст