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