СЕТЬ ПЕТРИ, ТЕКСТ ПРОГРАММЫ - Теория вычислительных процессов

Начальная разметка сети: одна фишка в позиции S1.

После завершения функционирования сети фишка будет в позиции S2

Расшифровка переходов:

    1. T1 - push f 2. T2 - push si 3. T3 - push di 4. T4 - push cx 5. T5 - push ax 6. T6 - clc 7. T7 - mov si,127 8. T8 - mov di,127 9. T9 - mov cx,128 10. T10 - mov al,[bx+si] 11. T11 - adc [bp+di],al 12. T12 - cmp byte ptr[bp+di],9 13. T13 - sub [bp+di],10 14. T14 - stc 15. T15 - clc 16. T16 - увеличение количества фишек 17. T17 - увеличение количества фишек 18. T18 - dec di 19. T19 - dec si 20. T20 - уменьшение количества фишек 21. T21 - pop ax 22. T22 - pop cx 23. T23 - pop di 24. T24 - pop si 25. T25 - popf
ТЕКСТ ПРОГРАММЫ

.model small

.stack 200h

.386

.data

Message1 db 'Vvedite pervoe chislo: ','$'

Message2 db 'Vvedite vtoroe chislo: ','$'

Message3 db 'Dla polucheniya rezultata nazmite Enter ',0dh,0ah,'$'

Message4 db 'ESC to exit or any key to continue...',0dh,0ah,'$'

Message5 db 0dh,0ah,'$'

Sign db 0 ; признак отрицательности

Sign1 db 0

Sign2 db 0

O2GrO1 db 0

Flagbuf1 db 0 ; флаг работы с первым числом

Crlf db 0dh,0ah,'$'

Buf db 255

Db 0

Db 255 dup(30h)

Buf1 db 255 ; максимальная длина строки

Db 0 ; реальная длина

Db 255 dup(30h) ; буфер для строки

Length1 db?

Buf2 db 255

Db 0

Db 255 dup(30h)

Buf3 db 255

Db 0

Db 255 dup(0h)

Length2 db?

Bcg db?

Bcg1 db?

Bcg2 db?

BcgP db? ; длина числа

Adg db?

Opr db 3

Db 0

Db 3 dup(30h)

Choice db 0 ; выбор пользователя

Cr equ 0dh

; символ возврата каретки

Lf equ 0ah

; символ перехода на следующую строку

EndMsg equ '$'

.code

;===================================

CLRSCR proc ; очистка экрана

Push bp

Mov bp, sp

Push ax

Push bx

Push cx

Push dx

Xor cx, cx

Mov dx,184FH ; координаты левого верхнего угла CH-y, CL-x

Mov al,0 ; координаты правого нижнего угла DH-y, DL-x

Mov ah,06H ; количество сдвигаемых строк, если 0, то весь экран

Mov bh,7 ; номер подфункции - очистка окна

Int 10h ; атрибут цвета (черно-белый)

Pop dx

Pop cx

Pop bx

Pop ax

Pop bp

Ret

CLRSCR endp

;==================================

CXY proc ; установка курсора

Push bp

Mov bp, sp

Push ax

Push bx

Mov bh,0

Mov ah,2 ; номер видеостраницы

Mov dh,0

Mov dl,0

Int 10h

Pop bx

Pop ax

Pop bp

Ret

CXY endp

;==================================

Print proc far

Mov ah,09h

Int 21h

Ret

Print endp

;==================================

Quit proc

Mov dx, offset message5

Call Print

Mov dx, offset message4

Call Print

Mov ah,1

Int 21h

Mov Choice, al

Cmp Choice,27 ; нажатие клавиши esc

Je Vihod

Jne start

Vihod:

Mov ax,4c00h ; выход в DOS

Int 21h

Ret

Quit endp

;==================================

Swap proc

Xor di, di

Xor dx, dx

Xor cx, cx

Xor ax, ax

Xor bx, bx

Mov al, bcg2

Add di, ax

Add di,1

CiclSwap1:

Mov dl, buf1[di]

Mov bl, buf2[di]

Mov buf1[di],bl

Mov buf2[di],dl

Dec di

Cmp di,1

Jg ciclSwap1

Xor ax, ax

Xor bx, bx

Mov al, bcg1

Mov bl, bcg2

Mov bcg1,bl ; bcg1:=bcg2

Mov bcg2,al ; bcg2:=bcg1

Ret

Swap endp

;===================================

Addition proc ; cложение чисел

Mov di,1

Xor ax, ax

Mov al, adg

Add di, ax ; сколько раз записывали в стек 1 число

Xor si, si

Mov cl, adg

CLC ; сброс флага переноса CF=0

Xor ax, ax

Pmm:

Mov al, buf1[di]

Mov ah, buf2[di]

Adc al, ah

; (1-й операнд)=(1-й операнд)+(2-й операнд)+(флаг CF)

Aaa ; комманда коррекции

Mov buf3[di],al

Push ax

Inc si

Dec di

Loop pmm

Jnc Viv ; переход, если нет переноса

Mov al,0

Mov ah,0

Adc al, ah

Push ax

Add adg,1

Jmp Viv

Viv:

Call VivodRes

Call quit

Ret

Addition endp

;===================================

AddNulls proc ; добавление нулей

Mov al, bcg2

Cmp bcg1,al

Jg ll3 ; bcg1>bcg2

Jl ll4 ; bcg1<bcg2

Jmp ANL

;Начало (Добавление нулей)

Ll3:

; bcg1>bcg2-добавляем нули ко второму числу

Xor di, di

Xor si, si

Xor ax, ax

Xor cx, cx

Xor bx, bx

Xor al, al

Add al, bcg1

Sub al, bcg2

Add di,2

Add di, ax

Mov cl, bcg2

Mov si,2

Lip:

Mov bl, buf2[si]

Mov buf3[di],bl

Inc di

Inc si

Loop lip

Xor si, si

Xor cx, cx

Xor bx, bx

Mov si,2

Mov cl, bcg1

Lop:

Mov bl, buf3[si]

Mov buf2[si],bl

Inc si

Loop lop

Jmp ANL

Ll4:

; bcg1<bcg2-добавляем нули к первому числу

Xor di, di

Xor si, si

Xor ax, ax

Xor cx, cx

Xor bx, bx

Mov al, bcg2

Mov adg, al

Xor al, al

Add al, bcg2

Sub al, bcg1

Add di,2

Add di, ax

Mov cl, bcg1

Mov si,2

L4p:

Mov bl, buf1[si]

Mov buf3[di],bl

Inc di

Inc si

Loop l4p

Xor si, si

Xor cx, cx

Xor bx, bx

Mov si,2

Mov cl, bcg2

Lo4:

Mov bl, buf3[si]

Mov buf1[si],bl

Inc si

Loop lo4

ANL: ret

AddNulls endp

;=====================================

Subtraction proc ; вычитание чисел

Mov di,1

Xor ax, ax

Mov al, adg

Add di, ax ; сколько раз записывали в стек 1 число

Xor si, si

Mov cl, adg

CLC

Xor ax, ax

Mmm:

Mov al, buf1[di]

Mov ah, buf2[di]

Sbb al, ah

Aas

Mov buf3[di],al

Push ax

Inc si

Dec di

Loop mmm

Call VivodRes ; вывод результата

Call quit

Subtraction endp

;========================================

Compression proc ; сжатие числа, ds:bx - @ числа

Push di ; di - длина числа

Push si ; si - смещение:куда записать правый символ

Push ax

Push cx

Dec di

NEXT_SYMBOL:

Cmp di,0

Je l1

Mov al,[BX+di-1]

MOV CL,4

SHL AL, CL

ADD AL,[BX+di]

JMP L2

L1:

MOV Al, byte ptr [BX+di]

L2:

MOV [bx+si],AL

SUB di,2

DEC si

CMP di,0

JNL NEXT_SYMBOL

L3: ; дозапись первых символов 0

Cmp si,0

JL L4

MOV byte ptr [bx+si],0

DEC si

JMP L3

L4:

Pop cx

Pop ax

Pop si

Pop di

Ret

Compression endp

;=========================================

Binary_to_DecPacked proc ; преобразует двоичное число в Упакованный формат, ds:bp - @ числа, ds:bx - @ упакованного числа

Push si

Push ax

Push di

Push cx

MOV CX,13

NEXT:

Push cx

Mov cx,5

Mov al,0

_min:

MOV DI,0 ; число > 10 ?

MOV CX,4

NEXT_DI:

Mov al,[bp+DI]

CMP byte ptr [bp+DI],0

JNE DIVISION

INC DI

LOOP NEXT_DI

DIVISION: ; a=a-10

Push bx

Pop bx

Push bp

Push bx

Pop bx

Pop bp

Jmp _min

OSTATOC: ; запись остатка

Pop cx

Mov di, cx

Mov al,[bp+4]

Mov [bx+di-1],al

Mov di,0

Next_char:

Mov [bp+di],al

Inc di

Cmp di,5

Jl next_char

Loop NEXT ; след разряд

Mov di,13 ; сжатие дес. числа

Mov si,12

Call compression

Pop cx

Pop di

Pop ax

Pop si

Ret

Binary_to_DecPacked endp

;========================================

VivodRes proc ; вывод результата

Mov di,2

Mov cl, adg

LViv:

Mov al, buf3[di]

Inc di

Or al,30h

Mov ah,2

Mov dl, al

Int 21h

Loop LViv

Ret

VivodRes endp

;=========================================

StrTo proc ; перевод в строку

Push bp

Mov bp, sp

Xor di, di

Xor si, si

Xor ax, ax

Xor dx, dx

Xor cx, cx

Mov al, bcgP ; длина числа

Add di, ax

Add di,1

Lp1:

Mov dl,[bx+di]

Dec di

Cmp dl,'-' ; если нашли знак "минус"

Je OtricatChislo ; то, фиксируем отрицательное число

Jne PolozhChislo ; иначе, число положительное

OtricatChislo:

Cmp flagbuf1,1 ; если это первое число

Je FirstNum ; да

Jne SecondNum ; нет

FirstNum: ; признак отрицательности первого числа

Mov Sign1,1

Mov Sign,1

Jmp EndPerev

SecondNum:

Mov Sign2,1 ; признак отрицательности второго числа

Mov Sign,1

Jmp EndPerev

PolozhChislo:

And dl,0fh ; очищаем зону тройки

Xor dh, dh

Push dx

Inc si

Xor dx, dx

Cmp di,1 ; если последний символ

Jg lp1 ; нет (di>1)

EndPerev:

Mov cx, si

Mov bcgP, cl

Xor ax, ax

Xor di, di

Add di,2

Lp2:

Pop ax

Mov [bx+di],al

Cmp flagbuf1,1 ; если это первое число

Je flb1

Jne flb2

Flb1:

Mov buf1[di],al

Mov buf[di],al

Jmp dalshe

Flb2:

Mov buf2[di],al

Dalshe:

Inc di

Loop lp2

Pop bp

QuitP:

Mov flagbuf1,0 ; обнуляем флаг работы с первым числом

Ret

StrTo endp

;=========================================

Start:

Call CLRSCR

Call CXY

Mov ax, DGROUP

Mov ds, ax

Mov dx, offset message1

Call Print

Xor dx, dx

Mov dx, offset buf1

Mov ah,0Ah

Int 21h

Mov dx, offset crlf

Call Print

Mov cl, buf1[1]

Mov length1,cl ; пересылка в cl длины первого числа

Mov dx, offset message2

Call Print

Xor dx, dx

Mov dx, offset buf2

Mov ah,0Ah

Int 21h

Mov dx, offset crlf

Call Print

Mov cl, buf2[1]

Mov length2,cl ; пересылка в cl длины второго числа

Mov dx, offset message3

Call Print

Mov ah,1

Int 21h

Mov Choice, al

Cmp Choice,13

Je Nach

Jne quit

Nach: ; начало:

Mov Sign,0 ; признак положительности обоих чисел

Mov Sign1,0 ; признак положительности первого числа

Mov Sign2,0 ; признак положительности второго числа

Mov bx, OFFSET Buf1;

; загрузка в bx адреса первого числа buf1

Mov al, length1 ; в al длина первого числа

Mov bcgP, al ; длина числа

Mov flagbuf1,1 ; флаг=1 работы с первым числом

Call StrTo

; двочно-десятичное число в неупакованном формате

Mov al, bcgP ; сколько раз записывали в стек 1 число

Mov bcg1,al

Mov bx, OFFSET Buf2;

; загрузка в bx адреса второго числа buf2

Mov al, length2 ; в al длина второго числа

Mov bcgP, al

Call StrTo

Mov al, bcgP ; сколько раз записывали в стек 2 число

Mov bcg2,al

Mov al, bcg1

Mov adg, al ; сколько раз записывали в стек 1число

Call AddNulls ; добавляем нули

Nxt:

Cmp Sign,1 ; если одно из чисел отрицательное

Je YesSign

Jne sravnpolozh ; да

YesSign: ; нет - оба положительные, производим сравнение

Cmp Sign1,1 ; если отрицательно первое число

Je YesSign1; да

Jne NoSign1 ; нет

YesSign1:

Cmp Sign2,0 ; второе положительное, то выводим минус, а числа суммируем

Je VivodMinus

Jne ObaOtricat ; оба отрицательны

VivodMinus:

Mov dl,'-'

Mov ah,2

Int 21h

Jmp AddDigit ; сложение

ObaOtricat:

Sub length1,1

Sub length2,1

Mov cl, length1

Cmp cl, length2 ; сравнение длин чисел

Jg FirstGreat ; длина первого числа больше

Jl SecondGreat ; длина второго числа больше

Je Sravnenie ; длины равны

FirstGreat:

Mov dl,'-' ; выводим минус

Mov ah,2

Int 21h

Jmp OnSub ; вычитание

Sravnenie:

Lea bx, buf1

Xor di, di

Add di,2

Cicl:

Mov ah,[bx+di]

Cmp ah, buf2[di]

Jg FirstGreat

Jl SecondGreat

Loop cicl

SecondGreat:

Call Swap

Jmp OnSub ; вычитание

NoSign1: ; первое число положительное

Cmp Sign2,1 ; а второе отрицательное

Je Summa

Summa:

Jmp AddDigit

Sravnpolozh:

Mov cl, length1

Cmp cl, length2 ; сравнение длин чисел

Jg FirstGreatP ; длина первого числа больше

Jl SecondGreatP ; длина второго числа больше

Je SravnenieP ; длины равны

SravnenieP:

Lea bx, buf1

Xor di, di

Add di,2

CiclP:

Mov ah,[bx+di]

Cmp ah, buf2[di]

Jg FirstGreatP

Jl SecondGreatP

Loop ciclP

FirstGreatP:

Jmp OnSub ; вычитание

SecondGreatP:

Call Swap

Mov dl,'-' ; выводим минус

Mov ah,2

Int 21h

Jmp OnSub ; вычитание

AddDigit: ; сложение

Call Addition

OnSub: ; вычитание

Call Subtraction

End start

Похожие статьи




СЕТЬ ПЕТРИ, ТЕКСТ ПРОГРАММЫ - Теория вычислительных процессов

Предыдущая | Следующая