лаб раб / МПС(2)02
.docВариант №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)