Создание подпрограммы преобразования 128-разрядного СЧ в УЧ

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

popzz

;Проверка правильности ввода 2го числа

xorbx, bxbl, b+1ch, chsi, si:di, dial, b1[si]:al, Tabl[di]

jec8didi, 10c9

jnec7:sisi, bxc10

jnec6:Error:

;Проверка. Если числа равны по длине то найти наибольшее.

;Если числа равны то вывести 0 на экран

;Если второе число меньше первого то выставить флаг и поставить знак "-"

xorax,ax

xorbx,bx

xordi,dial,a+1bl,b+1ax,bxc11c12:al,a+1di,axw3al,a1[di]bl,b1[di]ax,bx

jew1c12w2:

incdic11:znak,-flag,1c12:dx, s3ah, 09H21Hdx, NULLah, 09H21Heoj

c12:

;Приведение чисел во внутреннее представление

;1е число к виду 01 02 03 04 05ax, ax

xorsi, si

xorbx, bx

movbl, a+1:di, dial, a1[si]

e2:al, Tabl[di]e3didi, 10e2

e3:ax, dia1[si],al

incsisi, bxe4

jnee1

;перевод к виду 01 23 45

e4:ax, axbx, bx

xorsi, sial, a+1si, axdi, didi, siax, axdisi, 2

jeob1ob2:;если число из 2х символов(на всякий случай чистим a1[2])

mova1[2],#:si, 1

jnee5r1:;если число из 1го символа

jmpr2:sisi

moval, a1[si];умножаем n число на 10

movbl, 10hblsi

movbl, a1[si];прибавляем к получившемуся n+1 элемент и пишем в diый

addal, bla1[si], 0sia1[si], 0a1[di], aldi

cmpsi, 1e6e6e5:al, a+2

mov a1[di], alax,axal,a+1ax,2r2a+2, 0ax,3

jer2a+3, 0

;2е число к (01 02 03 04 05):

r2:

xorax, ax

xorsi, si

xorbx, bxbl, b+1

e7:di, dial, b1[si]:al, Tabl[di]e9didi, 16e8

e9:ax, dib1[si],alsi

cmpsi, bxe10e7

;к виду 01 23 45:ax, ax

xorbx, bx

xorsi, si

mov al, b+1si, axdi, didi, siax, ax

dec disi, 2ob3

jneob4:;если число из 2х символов(на всякий случай чистим b1[2])

movb1[2],0:si, 1e11

jer3:;если число из 1го символа

jmpr4:sisi

moval, b1[si];умножаем n число на 10

movbl, 10hblsi

movbl, b1[si];прибавляем к получившемуся n+1 элемент и пишем в diый

addal, blb1[si], 0sib1[si], 0b1[di], aldi

cmpsi, 1e12e12e11:al, b+2

mov b1[di], alax,axal,b+1ax,2

jer4b+2, 0ax,3r4

mov b+3, 0:

;Сохраняем длины чисел

xor ax,axal,a+1dlina_1,alal,b+1

movdlina_2,al

;############################################################

;Выделение памяти и запись чисел в выделенную память

;############################################################

;Выделяем память под первое числоbx,zseg ;получаем # параграфа конца программы + 1ax,es ;получаем # параграфа начала программыbx,ax ;вычисляем размер программы в параграфахah,4AH ;номер функции21H ;освобождаем памятьah,48H ;номер функцииbx,128 ;требуем 128 параграфа21H ;пытаемся отвести блокBLOCK_SEG1,ax;сохраняем адрес блока

;запись первого числаax,ax

xordi,disi,si

moval,a+1si,axax,axsies, BLOCK_SEG1;пишем в es адрес блока

cmpsi,0Zap_sim1Zap1

Zap_sim1:al,a1[si]

moves:[di],alZap2

Zap1:al,a1[si]

moves:[di],aldisisi,0Zap2

jneZap1:

;Выделяем память под второе числоbx,zseg ;получаем # параграфа конца программы + 1bx,128ax,es ;получаем # параграфа начала программыbx,ax ;вычисляем размер программы в параграфахah,4AH ;номер функции21H ;освобождаем памятьah,48H ;номер функцииbx,128 ;требуем 128 параграфа21H ;пытаемся отвести блокBLOCK_SEG2,ax;сохраняем адрес блока

;запись второго числаax,ax

xordi,disi,si

moval,b+1si,axax,axsies, BLOCK_SEG2;пишем в es адрес блока

cmpsi,0Zap_sim2Zap3_sim2:al,b1[si]es:[di],alZap4:al,b1[si]es:[di],aldisisi,0Zap4Zap3:

;выделяем память под результатbx,zseg ;получаем # параграфа конца программы + 1bx,256ax,es ;получаем # параграфа начала программыbx,ax ;вычисляем размер программы в параграфахah,4AH ;номер функции21H ;освобождаем памятьah,48H ;номер функцииbx,128 ;требуем 128 параграфа21H ;пытаемся отвести блокREZ,ax;сохраняем адрес блока

;############################################################

;Подготовка к вычитанию и вычитание

;############################################################

;работа с числамиal,dlina_1bl,dlina_2al,bl;проверка на длину числа

jess1ss2ss3

ss1:;если равны по длинеal,flag

cmpal,0Nachaloss1_1

ss1_1:al,dlina_1bl,dlina_2dlina_1,bldlina_2,al

moves,BLOCK_SEG1buf,eses,BLOCK_SEG2BLOCK_SEG1,eses,bufBLOCK_SEG2,es

jmpNachalo:znak,-ss1_1::

;Вычитаниеdi,disi,siax,axal,dlina_2si,ax

call vsub;вызов вычитания

;Вывод ответаax, ax

xorsi, si

xorbx, bxal,dlina_1

movdi, axes,REZes:[di],0viv1vivod1:dies:[di],0

jeviv1dx, s3ah, 09H21Hdx, znakah, 09H21H:al, es:[di]al, 4 al, 30hsimvol, aldx, simvolah, 09H21Hal, es:[di]al, 0FHal, 30hsimvol, aldx, simvolah, 09H

int 21Hdi,0vivod2

decdivivod1:

;############################################################

;Освобождение выделенной памяти после вычитания

;############################################################

;---освобождаем 1й блокax, BLOCK_SEG1 ;получаем стартовый адрес блокаes, ax ;помещаем его в ESah, 49H ;номер требуемой функции21H ;освобождаем блок памяти

;---освобождаем 2й блокax, BLOCK_SEG2 ;получаем стартовый адрес блокаes, ax ;помещаем его в ESah, 49H ;номер требуемой функции21H ;освобождаем блок памяти

;---освобождаем блок результатаax, REZ ;получаем стартовый адрес блокаes, ax ;помещаем его в ESah, 49H ;номер требуемой функции21H ;освобождаем блок памяти

;Конец программы

eoj:movah, 4CH21Hendp

;Функция "Вычитание"proc:es,BLOCK_SEG1al,es:[di]; в al разряд первого числа

moves,BLOCK_SEG2bl,es:[di];в bl разряд второго числа

jc V2; jc - был ли займ, если да то v3si,0;проверка на конец числаKonecal,bl; вычитание с займом; коррекцияes,REZes:[di],al; сохранение результата

incdisiV1

V2:al,bles,REZes:[di],aldi

dec siV1:bx,bxbl,dlina_1

moves,REZes:[di],aldi,bxm:dies,BLOCK_SEG1al,es:[di]es,REZes:[di],aldi,bxmetka

m:

ret

vsub endp

;вывод ошибки и переход к концу программы(eoj)

Error proc

lea dx, er

mov ah, 09H21Heojendp

;Очистка экрана

ClrScr procbpbp, spaxah, 0al, 210haxbp

retendp

;Установка курсора в нужное положение на экране

CXY procbpbp, spaxbxdxbh, 0ah, 2dx, [bp + 4]10hdxbxaxbpendp

Prog1endsSEGMENTENDSproc1