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

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

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

Содержание

 

Введение

Анализ

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

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

Верификация

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

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

. Цикла

Сети Петри.

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

Заключение.

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

 

Введение

 

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

 

Анализ

 

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

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

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 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:Prog1dbVvedite 1-e chislo$dbVvedite 2-e chislo$dbRezyltat:$db0$dboshibka vvoda!$db102;для 1го числа0db100 dup(0)db102;для 2го числа

db0db100 dup(0)db0123456789db $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