Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО Лабораторные 1-5.docx
Скачиваний:
57
Добавлен:
16.02.2016
Размер:
75.45 Кб
Скачать

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

  1. Поле 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

  1. Поле 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