- •Лабораторная работа №1. Изучение архитектуры эвм. Машинное исполнение, Требования языка Ассемблер.
- •1. Имеется команда:
- •1,1,2,3,5,8,13,...(Каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду loop.
- •2. Напишите программу для вычисления сумму первых 15 нечетных чисел Фибоначчи с первыми 5 четными числами Фибоначчи. Суммы должны вычисляться в подпрограммах.
- •Лабораторная работа №3 Изучение экранных операций.
- •Лабораторная работа №4 Изучение команд обработки строк
- •1.Замените в строке string символ & на символ пробела
- •Лабораторная работа №5. Изучение обработки двоичных данных, данных в форматах ascii и bcd, таблиц.
- •Datax dw 0148h
- •Dw 2316h
- •Datay dw 0237h
- •Dw 4052h
- •4. Определите 3 отдельные связанные таблицы, содержащие следующие данные:
Datax dw 0148h
Dw 2316h
Datay dw 0237h
Dw 4052h
Закодируйте команды для сложения:
а) слово DATAX со словом DATAY;
б) двойного слова, начинающегося по адресу DATAX , на слово DATAY.
MASM
MODEL small
STACK 256
.data
datax dw 0148h
dw 2316h
datay dw 0237h
dw 4052h
.code
main:
mov ax,@data ;настройка ds на
mov ds,ax ;сегмент данных
;сложение слова datax и слова datay
mov ax,datay
add datax,ax
;сложение двойного слова datax со словом datay
mov ax,datay
add datax,ax
adc datax+2,0
mov ax,4c00h
int 21h
end main
Поле UNPAK содержит 01040705 в распакованном десятичном формате. Напишите цикл, который преобразует это содержимое в ASCII - формат, т.е. 31343735.
MASM
MODEL small
STACK 256
.data
unpak db 5,8,7,0,4,0,1,0 ;unpak number 01040785
.code
main:
mov ax,@data ;настройка ds
mov ds,ax ;на сегмент данных
;преобразование распакованного BCD-числа
;в ASCII-формат
mov cx,8
mov di,0
go: add unpak[di],30h
inc di
loop go
;выводим полученное число
mov unpak[di],24h
lea dx,unpak
mov ah,09h
int 21h
mov ax,4c00h
int 21h
end main
Поле ASCA содержит значение 313733 в ASCII - формате, а другое поле ASCB содержит 35. Напишите программу, перемножающую эти числа в ASCII - формате и записывающую произведение в поле ASCPRO.
MASM
MODEL small
STACK 256
.data
asca db '3','3','7','3','1','3' ;313733 in ASCII
ascb db '5','3' ;35 in ASCII
tmp db 8 dup (0)
ascpro db 12 dup (0)
len1 equ 6
len2 equ 2
.code
main:
mov ax,@data
mov ds,ax
;программа умножает два числа в
;ASCII-формате.Результат - тоже в ASCII
mov cx,len1 ;вычитаем 30h - преобразуем
mov di,cx ;в распакованный BCD-формат
dec di
m1: sub asca[di],30h
dec di
loop m1
mov cx,len2
mov di,cx
dec di
m2: sub ascb[di],30h
dec di
loop m2
;умножение производим 'в столбик'
mov si,0
mov di,0
xor dl,dl ;CF:=0
mov cx,len1 ;длина asca
;умножаем на младшую цифру
m3: mov al,asca[si]
mul ascb ;младший байт
aam ;коррекция умножения
adc al,dl ;учет предыдущего переноса
aaa ;коррекция сложения с переносом
mov dl,ah ;сохранение переноса
mov ascpro[di],al ;сохранение результата
inc si
inc di
loop m3
mov ascpro[di],dl ;учет последнего переноса
mov si,0
mov di,0
xor dl,dl ;CF:=0
mov cx,len1
;умножаем на старшую цифру - аналогично
m4: mov al,asca[si]
mul ascb+1 ;старший байт
aam
adc al,dl
aaa
mov dl,ah
mov tmp[di],al
inc si
inc di
loop m4
mov tmp[di],dl
mov di,0
mov si,0
mov cx,len1
inc cx
add cl,dl
xor dl,dl
;складываем 'в столбик'
m5: mov al,ascpro[si+1]
adc al,tmp[si]
aaa
mov ascpro[di+1],al
inc si
inc di
loop m5
adc ascpro[di+1],0 ;перенос в старший разряд
mov cx,di
inc cx
;преобразуем обратно в ASCII-формат:
m6: add ascpro[di],30h
dec di
loop m6
mov ascpro[si+2],24h;$
lea dx,ascpro ;вывод числа
mov ah,09
int 21h
exit: mov ax,4c00h ;выход из программы
int 21h
end main
4. Определите 3 отдельные связанные таблицы, содержащие следующие данные:
а) числовые элементы - 06,10,14,21,24;
б) элементы наименований - видеокассеты, приемники, модемы, клавиатура, дискеты;
в) цены - 93.95, 82.25, 90.67, 85.80, 13.85.
Составьте программу, позволяющую вводить числовой элемент (ITEMIN) и количество (QTYIN) с клавиатуры. Разработайте программу табличного поиска элемента, равного ITEMIN. Выделите из таблиц наименование и цену. Рассчитайте стоимость (количество х цена) и выведите на экран наименование и стоимость.
MASM
MODEL small
STACK 256
.data
Item db 6,10,14,21,24 ;числовые элементы
name_ db 'tea $','coffee $','bread $','toys $','horses $'
price_c db 3,9,2,8,0,9,5,8,3,1 ;93,82,90,58,13;целые части цен
price_d db 5,9,5,2,7,6,0,8,5,8 ;95,25,67,80,85;дробные части цен
res_c db 5 dup (0) ;целая часть результата
tmp1 db 5 dup (0) ;для 1 частичного произведения
res_d db 5 dup (0) ;дробная часть результата
tmp2 db 5 dup (0) ;для 2 частичного произведения
resul_ db 9 dup (?) ;строка с результатом
num dw (0) ;для номера введенного элемента
itemin db (0) ;введенный элемент
item_ db 3 dup (?) ;в BCD-виде
qtyin db 3 dup (0) ;количество - в BCD-виде
len_qt db (?) ;длина BCD-представления
qt_db 3 dup (?) ;qtyin в ASCII-виде
deca db 10 ;для перевода из BCD
mes1 db 'Enter ITEMIN: $'
mes2 db 'Enter QTIN: $'
mes_db 'ERROR!!!$'
mes_n db 'Element NOT FOUND.Program terminated.$'
.code
main:
mov ax,@data ;настройка ds
mov ds,ax ;на сегмент данных
mov ax,0600h ;очистка экрана
mov bh,07h
mov cx,0
mov dx,184fh
int 10h
mov ax,0200h ;установка курсора
mov bh,0h
mov dh,3h
mov dl,1h
int 10h
jmp m0
err_1: jmp error_ ;переход по ошибке
;output mes1,input itemin,
;convert from BCD to binar
m0: mov ax,0200h ;очистка экрана
mov bh,0
mov dh,1
mov dl,1
int 10h
lea dx,mes1
mov ah,09h
int 21h
mov cx,3
mov di,0
m1: xor ax,ax ;цикл ввода itemin
mov ah,01
int 21h
cmp al,0dh ;если ENTER - выход
jz m2
sub al,30h ;в BCD
mov item_[di],al
inc di ;;перевод в двоичное представление
loop m1
m2: mov si,0 ;со старшей цифры
neg cx ;
add cx,3 ;cx:=3-cx
jcxz err_1 ;переход по ошибке
m3: mov al,item_[si] ;очередная цифра
push cx ;внутренний цикл перевода
dec cx
jcxz m4 ;если 10^0, то не умножать
m5: mul deca ;* на 10^(cx-1)
loop m5
m4: pop cx ;выход из внутреннего цикла
add itemin,al ;добавляем в двоичное представление
inc si
loop m3
;output mes2,input qtyin
mov ax,0200h
mov bh,0
mov dh,2
mov dl,1
int 10h
lea dx,mes2
mov ah,09h
int 21h
jc err_1
mov cx,3
mov di,0
mov len_qt,0 ;кол-во цифр в записи qtyin
m6: xor ax,ax ;цикл ввода
mov ah,01
int 21h
cmp al,0dh ;досрочный выход при Enter
jz m7
sub al,30h ;в BCD из ASCII
inc len_qt ;;;ввод с перестановкой местами цифр
cmp di,0 ;di = 0?
jz m25 ;if di = 0 then skip else dec di
dec di
cmp di,0 ;di = 0??
Jz m26 ;if di=0 then not (dec di) else (dec di)
dec di
mov bl,qtyin[di]
mov bh,qtyin[di+1]
mov qtyin[di+2],bh
mov qtyin[di+1],bl
mov qtyin[di],al
mov di,2
jmp m27
m26: mov bl,qtyin[di]
mov qtyin+1,bl
mov qtyin[di],al
inc di
jmp m27
m25: mov qtyin[di],al
m27: inc di
loop m6
;поиск элемента, равного itemin
m7:
mov di,0
mov dl,itemin
cmp dl,byte ptr item
jz m12
m11: inc di
cmp di,5
jz m13
cmp dl,item[di]
jnz m11
m12: mov num,di
jmp m14
; в num - адрес найденного элемента
m13: lea dx,mes_n
mov ah,09
int 21h
mov ax,4c00h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;вычисление результата:=price*qtyin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;address:=address*2
m14: mov bx,num
shl bx,1
;умножение целых частей чисел
;умножение производим 'в столбик'
mov si,0
mov di,0
xor dl,dl; CF:=0
mov ch,0
mov cl,len_qt ;длина qtyin
;умножаем на младшую цифру
m8: mov al,qtyin[si]
mul price_c[bx] ;младший байт
aam ;коррекция умножения
adc al,dl ;учет предыдущего переноса
aaa ;коррекция сложения с переносом
mov dl,ah ;сохранение переноса
mov res_c[di],al ;сохранение результата
inc si
inc di
loop m8
mov res_c[di],dl ;учет последнего переноса
mov si,0
mov di,0
xor dl,dl ;CF:=0
mov ch,0
mov cl,len_qt
inc bx
;умножаем на старшую цифру - аналогично
m9: mov al,qtyin[si]
mul price_c[bx] ;старший байт
aam
adc al,dl
aaa
mov dl,ah
mov tmp1[di],al
inc si
inc di
loop m9
mov tmp1[di],dl
mov di,0
mov si,0
mov cl,len_qt
sub dl,0
jz m22
inc cx
m22: xor dl,dl
;складываем 'в столбик'
m10: mov al,res_c[si+1]
adc al,tmp1[si]
aaa
mov res_c[di+1],al
inc si
inc di
loop m10
adc res_c[di+1],0 ;перенос в старший разряд
mov cx,di
inc cx
;;;;;;;;;;;;;;;;;;;;;
;decrement address-
снова на младшую цифру
dec bx
;;;;;;;;;;;;;;;;;;;;;
;умножение на дробную часть price
;умножение производим опять 'в столбик'
mov si,0
mov di,0
xor dl,dl; CF:=0
mov ch,0
mov cl,len_qt
;умножаем на младшую цифру
m15: mov al,qtyin[si]
mul price_d[bx]
aam
adc al,dl
aaa
mov dl,ah
mov res_d[di],al
inc si
inc di
loop m15
mov res_d[di],dl
mov si,0
mov di,0
xor dl,dl
mov ch,0
mov cl,len_qt
inc bx
;умножаем на старшую цифру - аналогично
m16: mov al,qtyin[si]
mul price_d[bx] ;старший байт
aam
adc al,dl
aaa
mov dl,ah
mov tmp2[di],al
inc si
inc di
loop m16
mov tmp2[di],dl
mov di,0
mov si,0
mov cl,len_qt
sub dl,0
jz m21
inc cx
m21: xor dl,dl
;складываем 'в столбик'
m17: mov al,res_d[si+1]
adc al,tmp2[si]
aaa
mov res_d[di+1],al
inc si
inc di
loop m17
adc res_d[di+1],0 ;перенос в старший разряд
mov cx,di
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;сложение целых частей результатов,
;result in res_c in ASCII
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov di,0
mov si,5
mov resul_[si],'.'
mov si,8
mov resul_[si],'$'
xor si,si
mov cl,len_qt
m18: mov al,res_c[di]
adc al,res_d[di+2]
aaa
;adc al,30h
mov res_c[di],al
inc di
loop m18
;adc res_c[di],30h
adc res_c[di],0h
inc di
;add res_c[di],30h
xor si,si
;dec di
;;;;mov целую часть to resul_;;;;;;;
mov cx,5
m19: mov al,res_c[si]
add al,30h
mov resul_[di],al
inc si
dec di
loop m19
mov cl,len_qt
;;;;;
;mov дробную часть from res_d to resul_ - in ASCII
;;;;;
mov cx,2
mov di,7
xor si,si
m20: mov al,res_d[si]
add al,30h
mov resul_[di],al
inc si
dec di
loop m20
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;
;output result
;;;;;;;;;;;;;;;;;;;;;
mov ax,0200h ;установка курсора
mov bh,0h
mov dh,3h
mov dl,1h
int 10h
mov si,num
shl si,3
lea dx,name_[si]
mov ah,09h
int 21h
mov ax,0200h
mov bh,0h
mov dh,3h
mov dl,15h
int 10h
lea dx,resul_
mov ah,09h
int 21h
jmp exit
error_: lea dx,mes_
mov ah,09h
int 21h
mov ah,4ch
int 21h
exit: mov ax,4c00h
int 21h
end main