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

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

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

Вариант №2

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

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

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

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

вар.

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

2

22,23,24,25,26,27,28,29,30,31

Программа:

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 22,23,24,25,26,27,28,29,30,31

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

cdseg ends

end start

Результат:

Числа 23,24,27,29,30.

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

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

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

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

вар.

Первое число

Второе число

Сумма

2

10

1

43

Программа:

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

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

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

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

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

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

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

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

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

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

int 20h

;data

first db ?

second db ?

mask db ?

cdseg ends

end start

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

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

вар.

Массив чисел

2

32

53

54

47

46

32

57

Программа:

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 32,53,54,47,46,32,57

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

cdseg ends

end start

Результат: 53,57.

Лабораторная работа 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 и возвести их в квадрат.

вар.

Массив

2

1

0

6

8

8

3

3

3

8

7

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,0,6,8,8,3,3,3,8,7

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

cdseg ends

end start

Результат: 6,3,3,3,.

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

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

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

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

вар.

Делимое

Делитель

2

125

15

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

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

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

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

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

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

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

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov ax,125 ; delimoe

mov cx,15 ; 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

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

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

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

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

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

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

вар.

Множимое

Множитель

2

24330

28184

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

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

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

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

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

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

cdseg segment 'code'

assume cs:cdseg

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

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

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

Ответ: 68571672010(28DF34F016)

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