лаб раб / МПС(2)01
.docМихайлова Ю.
Группа 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.