Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаб раб / МПС(2)01

.doc
Скачиваний:
11
Добавлен:
28.03.2015
Размер:
86.53 Кб
Скачать

Михайлова Ю.

Группа 3104

Вариант №16

Часть вторая.

Лабораторная работа 1

Организация условных переходов

Из имеющегося массива чисел осуществить выборку тех, которые имеют четное число единиц.

вар.

Исходный массив

16

12,13,14,15,16,17,18,19,20,21

Программа:

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov cx,(offset dest)-(offset source)

mov si,offset source

mov di,offset dest

m1: mov al,0 ;обнулим ax

add al,[si] ;добавим к al байт по смещению [si]

jnp m3 ;если флаг паритета сброшен, то прыгаем на m3

stosb ;иначе сохраняем al в память по смещению [di]

m3:inc si ; увеличим si, чтобы он указывал на следующий байт

loop m1

int 20h

;data

source db 12,13,14,15,16,17,18,19,20,21

dest db (offset dest)-(offset source) dup (0)

cdseg ends

end start

Результат:

Числа 13,15,16,19,20.

1.2 Лабораторная работа 2

Маскирование данных

ЦЕЛЬ РАБОТЫ: изучение программных способов маскирования данных.

Задание 1: Загрузить программным путем в память число 19 и число 21. Найти слово маски такое, чтобы сумма чисел была равна 23, поместить его в память, произвести операцию маскирования командой «лог. исключающее ИЛИ».

вар.

Первое число

Второе число

Сумма

16

26

9

35

Программа:

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov si,offset first ; загрузим в si смещение на первый операнд

mov [si],1Аh ;загрузим в память по смещению [si] первый операнд

mov ax,[si] ; загрузим в ax из памяти первый операнд

mov si,offset second ; загрузим в si смещение на второй операнд

mov [si],9h ;загрузим в память по смещению [si] второй операнд

add ax,[si] ; добавим к ax второй операнд

mov si,offset mask ; загрузим в si смещение на слово маски

mov [si],0h ;загрузим в память по смещению [si] слово маски

xor ax,[si] ; произведём над суммой (в регистре ax) и маской операцию <<ИСКЛЮЧАЮЩЕЕ ИЛИ>>

int 20h

;data

first db ?

second db ?

mask db ?

cdseg ends

end start

Результат: маска: 0.

Задание 2: Из имеющегося массива чисел осуществить выборку тех, которые имеют единицы в 5 и 1 разрядах.

вар.

Массив чисел

16

48

28

58

44

6

26

32

Программа:

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov cx,(offset dest)-(offset source)

mov si,offset source

mov di,offset dest

mov bl,10001b ; маска

m1: lodsb ; загрузим байт в al

and al,bl ; используем маску

cmp al,bl ; сравним результат с маской

jnz m3 ; если не равен, то прыгаем на m3

dec si ; иначе снова загружаем его

lodsb ; в al и сохраняем в

stosb ; массив dest

m3:

loop m1

int 20h

;data

source db 48,28,58,44,6,26,32

dest db (offset dest)-(offset source) dup (0)

cdseg ends

end start

Результат: В данном массиве таких чисел нет.

1.3 Лабораторная работа 3

Подпрограмма и стек

ЦЕЛЬ РАБОТЫ: исследование особенностей записи и обращения к подпрограммам, изучение методов использования стека при создании программ.

2. ПРОГРАММА ИССЛЕДОВАНИЯ ПРОЦЕССА ВЫПОЛ­НЕНИЯ КОМАНД ВЫЗОВА И ВОЗВРАТА ИЗ ПОД­ПРО­ГРАММ, А ТАКЖЕ КОМАНД РАБОТЫ СО СТЕКОМ.

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

call m1 ; вызов подпрограммы

int 20h

m1:

pushf ;сохраняем в стеке регистр флагов

push bx ; -''- bx

push dx ; -''- dx

push cx ; -''- cx

mov ax,05

mov bx,ax

add ax,ax

mov dx,ax

mov cx,ax

pop cx ; извлекаем из стека cx

pop dx ; -''- dx

pop bx ; -''- bx

popf ; -''- регистр флагов

ret ; возврат из подпрограммы

cdseg ends

end start

Задание: загрузить программным путем массив чисел. Сделать выборку чисел от 2 до 6 и возвести их в квадрат.

вар.

Массив

1

1

6

3

5

4

0

6

7

7

2

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov cx,(offset dest-offset source)/2

mov si,offset source

mov di,offset dest

m1:

lodsw ; загружаем из памяти слово

cmp ax,2 ; сравниваем его с нижней границей

jb m2 ; если меньше, то прыгаем на m2

cmp ax,6 ;сравниваем с верхней границей

ja m2 ; если больше, то прыгаем на m2

call sq ; вызываем подпрограмму

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

m2:

loop m1

int 20h

sq: ;подпрограмма возводит в квадрат содержимое ах

push cx ; затолкаем с стек сх

mov cx,ax ; счётчик

mov dx,0 ; результат

mov bx,0 ; ещё один счётчик

a1:

inc bx ; увеличим счётчик bx на 1

mov ax,bx ; проверяем bx на чётность

and ax,1

je a1 ;если bx - чётное, то прыгаем на a1

add dx,bx ; добавим к результату очередное нечётное число

loop a1

mov ax,dx ; перенесём результат в ax

pop cx ;восстановим сх

ret ; возврат из подпрограммы

; data

source dw 1,6,3,5,4,0,6,7,7,2

dest dw (offset dest-offset source)/2 dup (0)

cdseg ends

end start

Результат: 62 = 3610(2416), 32 = 910(916), 52 = 2510(1916), 42 = 1610(1016), 62 = 3610(2416),

22 = 410(416).

1.4 Лабораторная работа 4

Программная реализация деления

целых двоичных чисел

ЦЕЛЬ РАБОТЫ: освоение способов программной реализации деле­ния целых двоичных чисел.

вар.

Делимое

Делитель

1

78

10

а) с явным счетчиком

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov ax,78 ; делимое

dltl equ 10 ; делитель (константа)

mov dx,0 ; chastnoe

mov bx,0 ; ostatok

mov cx,16 ; счётчик

m0:

sal ax,1 ;сдвиг делимого влево

rcl bx,1 ;с переносом старшего бита в остаток

sub bx,dltl ; вычитаем из остатка делитель

jns m1 ; если рез-т отрицательный, то

add bx,dltl ; vosst ostatok

m1:

cmc ;invert cf

rcl dx,1 ; получаем очередной разряд частного

loop m0 ; если деление не закончено, то идём на m0

int 20h

cdseg ends

end start

Частное 7, остаток 8.

б) С неявным счетчиком:

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov ax,78 ; delimoe

mov cx,10 ; delitel

mov dx,1 ; chastnoe

mov bx,0 ; ostatok

m0:

sal ax,1 ;сдвиг делимого влево

rcl bx,1 ;с переносом старшего бита в остаток

sub bx,cx ; вычитаем из остатка делитель

jns m1 ; если рез-т отрицательный, то

add bx,cx ; vosst ostatok

m1:

cmc ;invert cf

rcl dx,1 ; получаем очередной разряд частного

jnc m0 ; если деление не закончено, то идём на m0

int 20h

cdseg ends

end start

Частное 7 , остаток 8.

5.1 Лабораторная работа 5

Программная реализация умножения

целых двоичных чисел

ЦЕЛЬ РАБОТЫ: освоение способов программной реализации умножения целых двоичных чисел.

Варианты заданий для лабораторной работы №5.

вар.

Множимое

Множитель

1

791

470

;произведение - регистровая пара dx:ax

;множитель (y) - bx

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

а его содержимое сохраняется в стеке

;множимое (x) - непосредственно суммируется к старшему слову произведения

;cx - указатель разряда

cdseg segment 'code'

assume cs:cdseg

x equ 791 ;множимое

y equ 470 ;множитель

org 100h

start:

mov bx,y

mov cx,1 ;загрузка указателя разряда

mov dx,0 ;обнуление dx

mov ax,0 ;обнуление ax

push ax

m0:

mov ax,bx

and ax,cx ;проверка очередного бита

jz m1

add dx,x

m1:

sar dx,1 ; сдвиг старшего слова результата

pop ax

rcr ax,1 ; сдвиг младшего слова результата

push ax

sal cx,1 ; сдвиг указатела разряда

jnc m0 ; если произошел перенос, то конец цикла

int 20h

cdseg ends

end start

Ответ: 5AC3A.

Соседние файлы в папке лаб раб