Создание подпрограммы преобразования 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