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

 

Содержание


Введение

Анализ

Блок-схема основной программы.

Линейная схема основной программы.

Верификация

. Без ветвлений

. С ветвлением

. Цикла

Сети Петри.

Операционная семантика

Заключение.

Приложение. Листинг программы


Введение


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


Анализ


В окончательной версии программы реализован ввод с клавиатуры числа, длиной не более 128 символов, проверка его на корректность ввода, преобразование из символьного представления в УЧ, размещение полученного числа в выделенной оперативной памяти.

Tabldb'0123456789'- таблица для проверки корректности ввода данных

flagdb0- искусственный флаг

dlina_1db0- хранит длину числаdw0- буфер_SEG1dw0 - хранит адрес блока выделенной ОП для числа

Блок-схема основной программы



Линейная схема основной программы


.СТАРТ (x)

// x - число, введенное с клавиатуры

.ЕСЛИ P(x), то на 2, иначе на 4

2.x1=f1(x)

3.x2=f2(x1)

.СТОП (x2)

Расшифровка символов, использующихся в данной схеме:

Переменные:

x, x1, x2.

Функциональные символы:

- операция перевода числа во внутреннее представление

- операция перевода в УЧ

Предикатные символы:

P - Если числа введены корректно

Cпециальные символы:

старт, стоп, если.

Аксиоматическая семантика

Множества

Z- множество целых чисел

- множество регистров

множество меток

Операции

+сложить

вычесть

неравно

=равно

:=присвоить

выполнить действия за стрелкой, если выполняются условия до стрелки

@обратиться по адресу

( )извлечь содержимое

&логическое и

…:ax, ax;(ax)=0bx, bx;(bx)=0si, si;(si)=0

mov al, a+1; (al)=(@(a1)+1)si, ax ;(si)=(ax)di, di;(di)=0di, si;(di)=(si)

xor ax, ax;(ax)=0di; (di)t = (di)(t-1)-1

…procbp; ((sp):=(sp)-2)&((@(ss)+(@(sp)))=(bp))bp, sp;(bp)=(sp)ax; ((sp):=(sp)-2)&((@(ss)+(@(sp)))=(ax))ah, 0;(ah)=0al, 2;(al)=2

int 10h; (sp)t=(sp)(t-1)-2, (sp)=(Flags), (sp)t=(sp)(t-1)-2, (sp)=(ip), (ip)=(132)

pop ax;((ax)=(@(ss)+(@(sp))))&((sp):=(sp)+2)bp;((bp)=(@(ss)+(@(sp))))&((sp):=(sp)+2)

ret; RET

ClrScr endp


Верификация


. Без ветвлений


movax, diS1a1[si],alS2siS3

Иcпользуем метод обратной волны:


. С ветвлением


cmp si,0

je Konecal,bl

Konec:bx,bxbl,dlina_1

Для доказательства того, что

(si>0)(si=0)

{ if si=0 then al=al-bl else bx=0}

(bx=0)

Необходимо доказать три условия истинности:

1)без побочных эффектов (si>0)

2)((si>0)(si=0)) & (si>0) {al=al-bl} (al=al-blbx=0)

((si>0)(si=0)) & (si>0) ( al-bl = al-bl bx=0)True

) ((si>0)(si=0)) & (si=0) {bx=0} (al=al-blbx=0)

((si>0)(si=0)) & (si=0) (al=al-bl0=0)

TrueTrue


. Цикла


dlina_1=число введенных знаков

dlina_2=число введенных знаков

;(dlina_1>dlina_2)

…= dlina_2bl,dlina_1


metka:dies,BLOCK_SEG1

di,bxmetkadi,2cl,adg:al,buf3[di]di

…LViv

P = di > 0 bx > 0= (di!=bx)= (di=bx)

S = (es=BLOCK_SEG1 di=di+1)= (bx-di)= (bx > 0)

di = bx

Покажем, что цикл всегда завершается, и продемонстрируем истинность следующих утверждений:

1)P->Inv

di > 0 bx > 0 bx > 0True

2)Inv {B} Inv

bx>0 {di!=bx} bx>0True

3)Inv B {S} Inv

bx>0 di!=bx {es = BLOCK_SEG1 di=di+1} bx>0>0 {es=BLOCK_SEG1} bx>0

bx>0 -> bx>0True

)Inv !B = Q>0 di=bx -> di=bxTrue

)D= B Inv {S} D <

(bx-di=) (di!=bx) (bx>0) {es = BLOCK_SEG1 di=di+1}(bx-di<)

(bx-di=) (di!=bx) (bx>0) -> bx - (di+1)<True

)D = {B} D<= - di = {di!=bx} bx-di<=- di = -> bx - di <=True

)D=0 Inv -> !Bdi=0 bx>0 -> !!(di=bx)di=0 bx>0 -> di=bxTrue

Сети Петри


Для построения сети Петри была выбрана основная программа



Операционная семантика


Для написания операционной семантики была выбрана команда dec.

Будем использовать одну ленту L1 и алфавит {0,1,#}.



L1:


1.q0101R1q01

2.q0111R1q01

3.q01#1L1q11

4.q1101q2111

5.q2111L1q11

6.q1111q3101

7.q11Top1R1q31


q3 - состояние, при котором выполняется остановка работы данной машины Тьюринга

Заключение


В результате проделанной работы были изучены основы программирования на языке Ассемблер, операционная семантика, проведена верификация линейного участка подпрограммы, участков с ветвлением и циклом, изучены сети Петри, составлена схема подпрограммы. Также была изучена работа с упакованными десятичными числами.

Приложение. Листинг программы

программа вычисление линейный графический

Вычитание 2х УДЦ с произвольным количеством разрядов

Prog1segmentcs:Prog1, ds:Prog1db'Vvedite 1-e chislo$'db'Vvedite 2-e chislo$'db'Rezyltat:$'db'0$'db'oshibka vvoda!$'db102;для 1го числа0db100 dup(0)db102;для 2го числа

db0db100 dup(0)db'0123456789'db' $'db ' $'

flagdb0_1db0;хранит длину 1го числа_2db0;хранит длину 2го числа

zzdw0

k10dw10

bufdw0_SEG1dw0;хранит адрес блока выделенной ОП для первого числа_SEG2dw0;хранит адрес блока выделенной ОП для второго числаdw0;хранит адрес блока выделенной ОП для результата

Proc1proccsds

callClrScr

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

;Ввод чисел и перевод их в нужную форму

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

;Курсор влево вверхdx,dx

pushdxCXYzz

; Вывод сообщения s1 на экранdx, s1ah, 09H21H

;Курсор на следующую строку

movdh,1dl,dldx

callCXYzz

; Ввод первого числа

movah, 0AHdx, a

int21H

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

cmpa+1, 0L1eoj:a+1, 101L2eoj

L2:

;Курсор на следующую строкуdh,2

xordl,dldxCXY

popzz

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

movbl,a+1ch, ch

xorsi, si:di, di

moval, a1[si]:al, Tabl[di]

jec3didi, 10c4

jnec2:sisi, bxc5

jnec1:Error:

; Вывод сообщения s2 на экран

leadx, s2ah, 09H

int21H

;На след строку курсор

movdh,3dl,dldx

callCXYzz

; Ввод второго числа

movah, 0AHdx, b

int21H

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

cmpb+1, 0L3eoj:b+1, 101L4eoj

L4:

;На след строку курсор

mov dh,4

xordl,dldxCXY

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


Содержание Введение Анализ Блок-схема основной программы. Линейная схема основной программы. Верификация . Без ветвлений . С ветвлением

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2018 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ