close

Вход

Забыли?

вход по аккаунту

?

kursovoy pechat

код для вставкиСкачать
Федеральное агентство по образованию "Ивановский государственный энергетический университет
имени В.И. Ленина"
Кафедра ПОКС
Отчет по курсовой работеет "Сложение 128 разрядных целых чисел, с использованием символьной арифметики"
по дисциплине
"Теория вычислительных процессов"
Выполнил: ст.гр.3-42к
Харьков Н.Н.
Проверил:
Зубков В.П.
Иваново 2013 План.
1. Формулировка задачи
2. Сведения о командах, реализующих суть задачи 3. Анализ поставленной задачи 4. Алгоритм задачи
5. Схема программы
6. Представление функционирования программы в виде сетей Петри
7. Код программы с аксиомами
8. Вывод
9. Литература
Формулировка задачи
Написать на ассемблере основную программу ввода двух целых символьных 128-значных чисел со знаком в десятичной системе счисления и подпрограмму их сложения, используя символьную арифметику, вывести результат на экран в виде символьного числа в десятичной системе счисления. Предусмотреть защиту от ввода ошибочных данных. Для каждой команды кода программы в листинге написать аксиому.
Сведения о командах, реализующих суть задачи
1) Команда ADD
Команда ADD позволяет производить сложение 8- или 16- битовых двоичных чисел в режиме регистр-регистр, регистр-память и память-регистр, причем адресация памяти осуществляется в любом допустимом режиме. Общее представление команды имеет вид ADD a1, b1 т.е. первый операнд складывается со вторым и результат операции замещает первый операнд.
2) Команда ADC
Команда ADC выполняет сложение с переносом: в отличие от команды ADD в операции сложения участвует флажок СF, значение которого прибавляется к младшему биту результата сложения операндов. 3) Команда сравнения Команда сравнения CMP выполняет вычитание второго операнда из первого, но нигде не запоминает результат операции и влияет только на состояние флажков.
4) Команда ААА
Команда десятичной коррекции для сложения ААА выполняет коррекцию суммы, полученной в результате выполнения команд ADD и ADC и должна следовать непосредственно за ними.
5)Команда SHR (SHift Right) выполняет логический сдвиг вправо операнда получателя данных на количество разрядов, указанных в исходном (т.е. втором) операнде. При этом старшие "выдвинутые" разряды заполняются нулями. shr al, 1
#
L1: al st 6)Команда SHL (сдвиг влево, синоним - SAL) перемещает каж-
дый бит операнда-приемника на один разряд влево, по направлению к
самому значащему биту. shl al, 1
#
L1: al st Анализ поставленной задачи
Для выполнения сложения устройство должно содержать поля первого слагаемого, второго слагаемого, суммы и промежуточного значения сложения. Алгоритмом сложения является сложением двух многозначных чисел в столбик. Пользователь вводит 2 числа. Возможные ошибки при вводе:
* Введены не цифры
Если произошла ошибка, то программа вызовет соответствующее сообщение.
Алгоритм задачи
1. Берем оба числа.
2. Складываем единицы первого разряда. Если сумма меньше десяти, записываем ее в разряд единиц ответа и переходим к следующему разряду. 3. Если сумма единиц больше или равна десяти, то представляем ее в виде а0 + b0 =10 +c0, где c0 - однозначное число; записываем c0 в разряд единиц ответа и прибавляем 1 к десяткам первого слагаемого, после чего переходим к разряду десятков. 4. Повторяем эти действия с десятками, сотнями и т.д. Процесс заканчивается, когда оказываются сложенными цифры старших разрядов. При этом если их сумма больше или равна десяти, то приписываем впереди обоих слагаемых нули, увеличиваем нуль перед первым слагаемым на 1 и выполняем сложение 1+0=1
Схема программы
Построим линейную схему программы.
0. СТАРТ (a, b)
// ввод с клавиатуры первое слагаемое и второе слагаемое
1. ЕСЛИ P(a,b), то z:=f1 на 3, иначе z:=f2 на 4
// проверка на корректность ввода
2. c:=f(a,b)
// сложение
3. Вывод результата на экран(с)
4. СТОП
Представление функционирования программы в виде сети Петри.
Код программы с аксиомами
lab3 segment
assume cs:lab3,ds:lab3
s1 db 'First number=$'
s2 db 0dh, 0ah, 'Second number=$'
er db 0dh, 0ah, 'Error', 0dh, 0ah, '$'
s11 db 127,0
a db 127 dup(' ')
s21 db 127,0
b db 127 dup(' ')
s31 db 0dh, 0ah, 'Summa='
c db 127 dup(' '), 0dh, 0ah, '$'
k dw 5h
z db 1
d1 db 0
d2 db 0 w1 db 65 dup(0)
w2 db 65 dup(0)
u1 db 65 dup(0)
u2 db 65 dup(0)
one db 64 dup(0),1
r dd 0 f db 99
DOP proc ; dop kod dlya minusa
mov di,si ;(di)=(si)
mov cx,65 ;(cx)=65
Q: mov al,99h ;(al)=99h
sub al,[si] ;(al)t=(al)t-1-((si))t-1
mov [si],al ;((si))=(al)
inc si;(si)t=(si)t-1+1 loop Q; (cx) = 0 => ↑ next, (cx) ≠ 0=> ↑@ (Q)
lea si,[one]; (si)=@((one))
call SL;= -2, ((sp))=(ip), (ip)=@SL
ret; (ip) = (sp), DOP endp
SL proc ; pod-prog clojeniya
xor ax,ax;(ax)t=(ax)t-1-(ax)t-1
mov cx,65;(cx)=65
T:
push cx; (sp)t=(sp)t-1 - 2, ((sp))=(cx)
mov bl,[di+64] ;(bl)=((di)+64)
mov cl,4;(cl)=4
shl bx,cl;(bx)t=(bx)t-1*2(cl)
mov cl,4
shr bl,cl;(bl)t=(bl)t-1/2(cl)
mov dl,[si+64]
mov cl,4
shl dx,cl
mov cl,4
shr dl,cl
add al,bl;(al)t=(al)t-1+(bl)t-1
add al,dl;(al)t=(al)t-1+(dl)t-1
aaa;корректировка результата mov bl,al
mov al,ah
add al,bh
add al,dh
aaa
mov bh,al
mov ax,0
adc al,al ; сложение с переносом
mov cl,4
shl bl,cl
mov cl,4
shr bx,cl
mov [di+64],bl ;((di)+64)=(bl)
dec di;(di)t=(di)t-1-1 dec si;(si)t=(si)t-1-1 pop cx;((cx))t=(sp)t ,(sp)t=(sp)t-1 + 2
loop T; (cx) = 0 => ↑ next, (cx) ≠ 0=> ↑@ (T)
ret; (ip) = (sp), SL endp
start proc
push cs ; (sp)t=(sp)t-1 - 2, ((sp))=(cs)
pop ds ;((ds))t=(sp)t ,(sp)t=(sp)t-1 + 2
mov dx, OFFSET s1 ; OFFSET помещает в регистр dx адрес строки т.е. (dx)=@(s1)
mov ah,09h ;(ah)=09h
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags)
;(sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
mov dx, OFFSET s11 ;(dx)=@(s11)
mov al,0 ;(al)=0 mov ah,0ah ;(ah)=0ah
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags)
;(sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
mov dx, OFFSET s2 ; (dx)=@(s2)
mov ah,09h ;(ah)=09h
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags)
;(sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
mov dx, OFFSET s21 ; (dx)=@(s21)
mov al,0 ;(al)=0
mov ah,0ah;(ah)=0ah
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags)
;(sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134 xor dx,dx ; (dx)t=(dx)t-1-(dx)t-1
xor bx,bx ; (bx)t=(bx)t-1-(bx)t-1 mov al,0fh;(al)=0fh
xor ah,ah; (ah)t=(ah)t-1-(ah)t-1
push ax; (sp)t=(sp)t-1 - 2, ((sp))=(ax)
lea di,[a];(di)=@((a))
mov al,[di];(al)=((di))
cmp al,'-';(Reg) = (al- ('-') ,(Flags)
jne L1; (Res) ≠ 0 => ↑@(L1)
mov ah,80h;(ah)=80h
mov [w1],ah;((w1))=(ah)
inc di ;(di)t=(di)t-1+1 mov al,[di];(al)=((di))
jmp L2; ↑ @ (L2)
L1: cmp al,'+' ;(Reg) = (al- ('+')),(Flags)
jne L2; (Res) ≠ 0 => ↑@(L2)
inc di;(di)t=(di)t-1+1 mov al,[di];(al)=((di))
L2:
cmp al,0dh ;(Reg)=((al)- (0dh)) ,(Flags)
je L8;(Res)=0 => ↑@(L8)
cmp al,'0';(Reg) = (al- ('0') ,(Flags)
jge L3;(Res)>=0 => ↑@(L3)
mov dx, OFFSET er;(dx)=@(er)
mov ah,09h;(ah)=09h
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags); (sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
mov ah, 01h;(ah)=01h
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags); (sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
mov ah,4ch;(ah)=4ch
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags); (sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134 L3: ; proverka =<4
cmp al,'4';(Reg) = (al- ('9') ,(Flags)
jle L4 ;(Res)<=0 => ↑@(L4)
mov dx, OFFSET er ;(dx)=@(er)
mov ah,09h;(ah)=09h
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags); (sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
mov ah,01h;(ah)=01h
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags); (sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
mov ah,4ch;(ah)=4ch
int 21h ;{(sp)t=(sp)t-1-2, ((sp))=(Flags); (sp)t=(sp)t-1-2, ((sp))=(cs) ; (sp)t=(sp)t-1-2, ((sp))=(ip), ; (cs)=132, (ip)=134
L4:
and al,0Fh;(al)t=(al)t-1&(0Fh)t-1
xor ah,ah; (ah)t=(ah)t-1-(ah)t-1
push ax; (sp)t=(sp)t-1 - 2, ((sp))=(ax)
inc di;(di)t=(di)t-1+1 mov al,[di];(al)=((di))
jmp L2; ↑ @ (L2)
L8:
lea di,[w1+64] ;(di)=@((w1+64))
L9:
pop ax ; ((ax))t=(sp)t ,(sp)t=(sp)t-1 + 2
cmp al,0fh;(Reg)=((al)- (0fh)) ,(Flags)
je L10; (Res)=0 => ↑@(L10)
mov cl,4;(cl)=4
shl al,cl;(al)t=(al)t-1*2(cl)
pop bx ; ((bx))t=(sp)t ,(sp)t=(sp)t-1 + 2
mov ah,bl ;(ah)=(b1)
cmp ah,0fh;(Reg)=((ah)- (0fh)) ,(Flags)
jne L11; (Res) ≠ 0 => ↑@(L2)
xor ah,ah; (ah)t=(ah)t-1-(ah)t-1
mov cl,4;(cl)=4
shr ax,cl;(ax)t=(ax)t-1/2(cl)
mov [di],al;((di))=al
dec di;(di)t=(di)t-1-1 jmp L10; ↑ @ (L10)
L11:
mov cl,4;(cl)=4
shr ax,cl;(ax)t=(ax)t-1/2(cl)
mov [di],al;((di))=al
dec di;(di)t=(di)t-1-1 jmp L9; ↑ @ (L9)
L10:
; VTOROE CHISLO
xor dx,dx; (dx)t=(dx)t-1-(dx)t-1
xor bx,bx;(bx)t=(bx)t-1-(bx)t-1
mov al,0fh;(al)=0fh
xor ah,ah;(ah)t=(ah)t-1-(ah)t-1
push ax;(sp)t=(sp)t-1 - 2, ((sp))=(ax)
lea di,[b];(di)=@((b))
mov al,[di];(al)=((di))
cmp al,'-'
jne L2_1
mov ah,80h
mov [w2],ah;((w2))=(ah)
inc di ; perexod na cled cimvol mov al,[di]
jmp L2_2
L2_1: cmp al,'+'
jne L2_2
inc di
mov al,[di]
L2_2:
cmp al,0dh ; proverka =>0
je L2_8
cmp al,'0'
jge L2_3
mov dx, OFFSET er
mov ah,09h
int 21h
mov ah, 01h
int 21h
mov ah,4ch
int 21h
L2_3: ; proverka =<4
cmp al,'4'
jle L2_4 ; L4 -> cifra
mov dx, OFFSET er
mov ah,09h
int 21h
mov ah, 01h
int 21h
mov ah,4ch
int 21h
L2_4:
and al,0Fh
xor ah,ah
push ax
inc di
mov al,[di]
jmp L2_2
L2_8:
lea di,[w2+64]
L2_9:
pop ax
cmp al,0fh
je L2_10
mov cl,4
shl al,cl
pop bx
mov ah,bl
cmp ah,0fh
jne L2_11
xor ah,ah
mov cl,4
shr ax,cl
mov [di],al
dec di
jmp L2_10
L2_11:
mov cl,4
shr ax,cl
mov [di],al
dec di
jmp L2_9
L2_10:
mov al,[w1]
cmp al,80h
jne L15
lea si,[w1]
mov al,00h
mov [si],al
call DOP;= -2, ((sp))=(ip), (ip)=@DOP
L15: mov al,[w2]
cmp al,80h
jne L16
lea si,[w2]
mov al,00h
mov [si],al
call DOP;= -2, ((sp))=(ip), (ip)=@DOP
L16:
lea si,[w1]
lea di,[w2]
call SL;= -2, ((sp))=(ip), (ip)=@SL
lea di,[c]
lea si,[w2]
mov al,[si]
cmp al,00h
mov cx,64
je L17
call DOP
lea di,[c]
lea si,[w2]
mov al,80h
mov [si],al
mov al,'-'
mov [di],al
mov cx,64
L17:
push cx
inc di
inc si
xor ax,ax
mov al,[si]
mov cl,4
shl ax,cl
mov cl,4
shr al,cl
OR ax,3030h;(ax)t=(ax)t-1V 3030h
mov [di],ah
inc di
mov [di],al
pop cx ; ((cx))t=(sp)t ,(sp)t=(sp)t-1 + 2
loop L17 ; (cx) = 0 => ↑ next, (cx) ≠ 0=> ↑@ (L17)
mov al,f
call L33 L33: cmp al,0
je L44
dec al
jmp L33
L44: mov dx, OFFSET s31
mov ah,09h
int 21h mov ah,01h
int 21h
mov ah,4ch
int 21h
start endp
lab3 ends
end start
Вывод
В результате работы получена эффективная программа, моделирующая сложение двух целых чисел. Описана семантика некоторых фрагментов программы и представлено функционирование программы в виде сетей Петри.
Литература
1. Юров "Assembler".
2. Сергеев "Основы вычислительной техники".
Документ
Категория
Рефераты
Просмотров
6
Размер файла
527 Кб
Теги
kursovoy, pechat
1/--страниц
Пожаловаться на содержимое документа