Курсовая работа
На тему
«Перевод чисел изразличных систем счисления»
Рязань 2009
/>/>/>Введение
В даннойкурсовой работе возникает задача разработки приложения, позволяющего выполнятьперевод чисел из различных систем счисления, с применением средств ассемблерапроцессора x86.
/>/>/>1. Техническое задание/>/>1.1 Основания дляразработки программы
Разработкапрограмм ведется на основании следующих документов:
1. ГОСТ19.001–77
Единаясистема программной документации. Общие положения
2. ГОСТ19.101–77
Единаясистема программной документации. Виды программ и программных документов
3. ГОСТ19.201–78
Единаясистема программной документации. Техническое задание. Требования к содержаниюи оформлению
4. ГОСТ19.202–78
Единаясистема программной документации. Спецификация. Требования к содержанию иоформлению
5. ГОСТ19.301–79
Единаясистема программной документации. Программа и методика испытаний. Требования ксодержанию и оформлению
6. ГОСТ19.401–78
Единаясистема программной документации. Текст программы. Требования к содержанию иоформлению
7. ГОСТ19.402–78
Единаясистема программной документации. Описание программы
8. ГОСТ19.404–79
Единаясистема программной документации. Пояснительная записка. Требования ксодержанию и оформлению
9. ГОСТ19.503–79
Единаясистема программной документации. Руководство системного программиста.Требования к содержанию и оформлению
10. ГОСТ19.504–79
Единаясистема программной документации. Руководство программиста. Требования ксодержанию и оформлению
11. ГОСТ19.505–79
Единаясистема программной документации. Руководство оператора. Требования ксодержанию и оформлению
12. ГОСТ19.701–90
Единаясистема программной документации. Схемы алгоритмов, программ, данных и систем.Условные обозначения и правила выполнения/>/>1.2 Назначение разработки
Программаслужит для переводачисел из систем счисления с основанием 2, 8, 10, 16./>/>1.3 Требования к программе
Впрограмме организация входных данных осуществляется в виде поля для ввода числаи переключателей для выбора системы счисления. Организация выходных данныхосуществляется в виде метки./>/>1.4 Требования кнадежности
Впрограмме обеспечивается контроль правильности ввода числа. Если число введеноне корректно, то выводится сообщение об ошибке.
/>/>/>2. Описание разработанной программы/>/>2.1 Общие сведения
Наименованиеи обозначение программы «perevod».
Длявыполнения программы необходима ОS Windows 9x/2000/XP/vista/7
Программанаписана с использованием Delphi 7, TASM32./>/>2.2 Описание логическойструктуры
1) Окно формы в начале выполнения программы:
/>
Окноформы при выполнении
Алгоритмыобработчиков событий для программы:
1)Событие С1 – для выхода из программы. Выполнение обработчика происходит принажатии кнопки «Выход».
/>
Блок-схемаалгоритма обработчикасобытия Button2Click
2) СобытиеС2 – перевод числа из одной системы счисления в другую (Рис. 3.2).Выполнение обработчика происходит при нажатии кнопки «Выполнить».
Описаниеалгоритма:
Определяетсявыходная система счисления iпри помощи переключателей RadioButton, копируется содержимое Edit1.text в параметр s, вызывается ассемблерная процедура, вкоторую передаются параметры s и i. После выполнения проверяется наличиеошибок, и если ошибки находятся, то выводится сообщение о соответствующейошибке, иначе выводится результат выполнения процедуры.
3)Процедура Perevod – внешняя процедура(external), написанная на языке ассемблера. Модель памятималенькая(small), передача параметроврегистровым способом(register). Находится в модуле modul.obj.
Параметрамиявляются строка типа shortstring(указатель на строку), передается через регистр eax; число типа integer, передается через регистр ecx.
Объявляютсялокальные параметры: srt – массив, элементы которого типа byte, iss – параметртипа dword, для хранения входнойсистемы счисления, oss – параметр типа dword,для хранения выходной системы счисления; flag – параметр типа dword, для хранения кода ошибки.
/>
Блок-схемаалгоритма обработчикасобытия Button1Click
Описаниеалгоритма:
Определяемдлину строки (нулевой элемент строки). Если длина равна нулю, то выходим изпроцедуры и передаем код ошибки 1, иначе вызываем процедуру inputss, в которойопределяется входная разрядность и генерируется код ошибки. Далее проверяетсякод ошибки, если он не равен нулю, то выходим из процедуры и передаем кодошибки, иначе вызываем процедуру verinput, в которой проверяется правильностьввода, производится перевод символов в числа и генерируется код ошибки. Далеепроверяется код ошибки, если он не равен нулю, то выходим из процедуры ипередаем код ошибки, иначе вызываем процедуру perepolnenie, в которойпроизводится окончательный перевод строки в число, происходит проверка напревышение допустимых значений входного числа, перевод в другую системусчисления, создание новой строки и генерация кода ошибки.
/>
Далеепроверяется код ошибки, если он не равен нулю, то выходим из процедуры ипередаем код ошибки, иначе выходим из процедуры и передаем новую.
/>
Блок-схемапроцедуры Perevod
4)Процедура inputs. Находится в модулеmodul.obj.
Параметрамиявляются строка типа указатель на строку – ebx, длина строки – edi.
Описаниеалгоритма:
Считываемпоследний символ строки. Если его код находится в диапазоне 30h – 39h, товозвращаем 10, как основание входной системы счисления. Если код последнегосимвола 62h, то возвращаем 2, как основание входной системы счисления. Если кодпоследнего символа 6аh, то возвращаем 8, как основание входной системысчисления. Если код последнего символа 68h, то возвращаем 16, как основаниевходной системы счисления. Иначе возвращаем код ошибки равный 2.
5)Процедура verinput. Находится в модулеmodul.obj.
Описаниеалгоритма:
Считываемпервый символ строки. Если его код 30h, то возвращаем код ошибки 4. Еслиоснование входной системы счисления 16, то проверяем каждый элемент массива вдиапазоны: если входит в диапазон 0..9, то вычитаем 30h, если входит в диапазонA..F,то вычитаем 37h, если входит в диапазон a..f, то вычитаем 57h, иначе возвращаем код ошибки 3.
6)Процедура perepolnenie. Находится в модулеmodul.obj.
Описаниеалгоритма:
Отмладших адресов к старшим прибавляем элементы массива к результату и умножаемна основании системы счисления. Если результат больше 7fffffffh, то возвращаемкод ошибки 5. Иначе делим результат на основание выходной системы счисления,пока результат не станет равным нулю и записываем остатки от деления в массив.Далее прибавляем к элементам массива 30h, если он входит в диапазон 1..9, илиприбавляем 57h, если нет.
/>
Блок-схемапроцедуры inputss/>/>2.3 Используемыетехнические средства
Привыполнении данной курсовой работы используется персональный компьютер поколенияIntel. Данный компьютер оснащен всеми устройствами необходимыми для работы всреде разработки Delphi 7, и последующем запуске полученных программ.
/>/>2.4 Вызов и загрузка
Программа№1 начинает свою работу при запуске приложения с именем «perevod.exe»./>/>2.5 Входные данные
Дляпрограммы входными данными являются строка edit1.text и переключателиradiobutton1, radiobutton2, radiobutton3, radiobutton4./>/>2.6 Выходные данные
Впрограмме выходными данными будет являться строка label1.caption.
/>/>/>3. Программа и методика испытаний/>/>3.1 Объект испытаний
Объектамииспытаний являются три разработанных приложения: perevod.exe./>/>3.2 Цель испытаний
Цельюиспытаний данных приложений является выяснение возможных ошибок во времявыполнения программы, которые не были обнаружены на стадии разработки./>/>3.3 Требования к программе
Программыдолжны надежно работать и выполнять свои функции при любых возможных наборахисходных данных, выдавая результат за конечное время./>/>3.4 Требования кпрограммной документации
Техническое задание – ГОСТ 19.201–78
Программа и методика испытаний – ГОСТ 19.301–79
Текст программы – ГОСТ 19.401–78
Описание программы – ГОСТ 19.402–78/>/>3.5 Средства испытаний
Для проведения испытаний используется IBM-совместимый персональный компьютер с операционной системой семейства Windows.
/>/>3.6 Методы испытаний
· Входные данные:
строка: «»
переключатель: десятичная
Результат: сообщение «пустая строка»
· Входные данные:
строка: «12345q»
переключатель: десятичная
Результат: сообщение «неверный завершающийсимвол»
· Входные данные:
строка: «ffffffffh»
переключатель: десятичная
Результат: сообщение «превышение допустимогодиапазона»
· Входные данные:
строка: «123nv23»
переключатель: десятичная
· Результат: сообщение «строка введена некорректно»
· Входные данные:
строка: «012345»
переключатель: десятичная
· Результат: сообщение «строка начинается снуля»
· Входные данные:
строка: «12345»
переключатель: десятичная
· Результат: 12345
· Входные данные:
строка: «12345»
переключатель: двоичная
· Результат: 11000000111001b
· Входные данные:
строка: «12345»
переключатель: восьмеричная
· Результат: 30071o
· Входные данные:
строка: «12345»
переключатель: шестнадцатеричная
· Результат: 3039h
· Входные данные:
строка: «12345h»
переключатель: десятичная
· Результат: 74565
· Входные данные:
строка: «12345h»
переключатель: двоичная
· Результат: 10010001101000101b
· Входные данные:
строка: «12345h»
переключатель: восьмеричная
· Результат: 221505o
· Входные данные:
строка: «12345h»
переключатель: шестнадцатеричная
· Результат: 12345h
· Входные данные:
строка: «12345o»
переключатель: десятичная
· Результат: 5349
· Входные данные:
строка: «12345o»
переключатель: двоичная
· Результат: 1010011100101b
· Входные данные:
строка: «12345o»
переключатель: восьмеричная
· Результат: 12345o
· Входные данные:
строка: «12345h»
переключатель: шестнадцатеричная
· Результат: 14E5h
· Входные данные:
строка: «1011001010b»
переключатель: десятичная
· Результат: 714
· Входные данные:
строка: «1011001010b»
переключатель: двоичная
· Результат: 1011001010b
· Входные данные:
строка: «1011001010b»
переключатель: восьмеричная
· Результат: 1312o
· Входные данные:
строка: «1011001010b»
переключатель: шестнадцатеричная
· Результат: 2CAh
/>/>4. Руководствооператора (пользователя)/>4.1 Назначение и условия применения программ
Программаслужит для переводачисел из систем счисления с основанием 2, 8, 10, 16. Для того чтобы программаработала и выполняла соответствующие функции, компьютер должен иметьопределенные технические средства, а именно:
1) Windows 9x/2000/Me/Xp
2) Процессор не ниже PENTIUM 2 400
3) ОП 64 мб/>4.2 Обращение к программам для запуска
Длязапуска программы необходимо запустить приложение «perevod.exe»./>4.3 Входные и выходные данные
Дляпрограммы входными данными являются число и переключатели.
Выходнымданным будет число, переведенное в систему счисления./>4.4 Сообщения оператору
1)если поле ввода пусто, то выводится сообщение:
/>
2)если завершающий символ введен неверно, то выводится сообщение:
/>
3)если превышен диапазон значений, то выводится сообщение:
/>
4)если число введено не корректно, то выводится сообщение:
/>
5)если первый символ ноль, то выводится сообщение:
/>
Приложение
Текстосновного модуля среды Delphi
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
Button2: TButton;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
{$l modul.obj}
{$R *.dfm}
procedure perevod (var s:shortstring; i:integer); external;
procedure TForm1. Button1Click (Sender: TObject);
var
s:string[32];
i:integer;
begin
label1. Caption:='';
if radiobutton1. Checked then
i:=10
else if radiobutton2. Checked then
i:=2
else if radiobutton3. Checked then
i:=8
else if radiobutton4. Checked then
i:=16;
s:=edit1. Text;
perevod (s, i);
if s[1]=#1 then
showmessage ('строка пустая')
else if s[1]=#2 then
showmessage ('последний символ долженбыть:'+#13+#10+'цифра, если десятичная система, '+#13+#10+'b, если двоичная система, '+#13+#10+'o, если восьмеричная система, '+#13+#10+'h, если шестнадцатиричная система')
else if s[1]=#3 then
showmessage ('число введено неправильно')
else if s[1]=#4 then
showmessage ('ноль не может быть первым символомчисла')
else if s[1]=#5 then
showmessage ('число должно быть вдиапазоне'+#13+#10+'0..2147483647, если десятичная система, '+#13+#10+'1111111111111111111111111111111,если двоичная система, '+#13+#10+'17777777777, если восьмеричная система, '+#13+#10+'7FFFFFFF, если шестнадцатиричная система')
else label1. Caption:=s;
end;
procedure TForm1. Button2Click (Sender: TObject);
begin
close;
end;
end.
Текст модуля на языке ассемблера
;#########################################################################
586
model use32 small;, pascal
data
str db 32 dup (0)
flag DD 0
iss DD 0
oss DD 0
code
;##########################################################################
; inebx указатель на строку, edi длина строки
; outiss выходная разрядность, flag код ошибки
inputssproc; процедура для определения входной системы счисления
publicinputss
cmpBYTE PTR [ebx+edi], 30h; если последний элемент массива меньше 30h
jb.ErrInSS; то переход к. ErrInSS
cmpBYTE PTR [ebx+edi], 39h; если последний элемент массива больше 39h
ja.bin;то переход к.bin
moviss, 10; иначе копируем 10 в iss
jmp.exitinputss;переход к.exitinputss
bin:
cmpBYTE PTR [ebx+edi], 62h; если последний элемент массива не равен 62h
jne.oct;то переход к.oct
moviss, 2; иначе иначе копируем 2 в iss
jmp.mod; переход к.mod
oct:
cmpBYTE PTR [ebx+edi], 6fh; если последний элемент массива не равен 6fh
jne.hex;то переход к.hex
moviss, 8; иначе иначе копируем 8 в iss
jmp.mod;переход к.mod
hex:
cmpBYTE PTR [ebx+edi], 68h; если последний элемент массива не равен 68h
jne.ErrInSS; то переход к. ErrInSS
moviss, 16; иначе иначе копируем 16 в iss
jmp.mod;переход к.mod
mod:;если система счисления 2, 8 или 16
decBYTE PTR [ebx]; то декремент системы счисления в паияти
decedi; и в регистре edi
jmp.exitinputss;переход к.exitinputss
ErrInSS:
movflag, 2; присваеваем flag код ошибки 2
exitinputss:
ret
inputssendp
;#########################################################################
; iniss входная разрядность, ebx указатель на строку, edi длина строки
; outflag флаг ошибки
verinputproc; процедура проверки правельности ввода
public verinput
push edi
push eax
je.null;то переход к.null
moveax, iss; копируем основание системы счисления в eax
cmpeax, 16; если основание системы счисления равно 16
je.hexver;то переход к.hexver
ver:
subBYTE ptr [ebx+edi], 30h; вычитаем из элемента массива 30h
jb.errinput;если результат меньше 0, то переход к.errinput
cmpBYTE ptr [ebx+edi], al; если результат больше или равен основанию системысчисления
jae.errinput;то переход к.errinput
decedi; декремент edi
cmpedi, 0; если edi не равен нулю
jmp.exitverinput; переход.exitverinput
hexver:
subBYTE ptr [ebx+edi], 30h; вычитаем из элемента массива 30h
jb.errinput;если результат меньше 0, то переход к.errinput
cmpBYTE ptr [ebx+edi], 10; если результат меньше 10
jb.p2;то переход к.p2 (если символ в диапазоне 0..9)
subBYTE ptr [ebx+edi], 7h; вычитаем из элемента массива 7h
cmpBYTE ptr [ebx+edi], 10; если результат меньше 10
jb.errinput;если результат меньше 10, то переход к.errinput
cmpBYTE ptr [ebx+edi], 10h; если результат меньше 10
subBYTE ptr [ebx+edi], 20h; вычитаем из элемента массива 20h
jb.errinput;если результат меньше 0, то переход к.errinput
jb.p2;то переход к.p2 (если символ в диапазоне a..f)
jmp.errinput;иначе переход к.errinput
errinput:
movflag, 3; присваеваем flag код ошибки 3
jmp.exitverinput;переход к.exitverinput
p2:
decedi; декремент edi
cmpedi, 0; если edi не равен нулю
jne.hexver;то переход к.hexver
jmp.exitverinput;иначе переход к.exitverinput
null:
movflag, 4; присваеваем flag код ошибки 4
exitverinput:
pop eax
pop edi
ret
verinputendp
;#########################################################################
; iniss входная разрядность, ebx указатель на строку, edi длина строки, ossвыходная; разрядность
; out
perepolnenieproc; проверка превышения максимальных значений и окончание перевода
public perevod
push edi ; сохраняем ediв стеке
xor ecx, ecx ; очищаем регистры
xor edx, edx;
xor esi, esi;
xor eax, eax;
point1:
mov cl, BYTE ptr [ebx+esi+1]; пересылаем байт под номером esi в cl
addeax, ecx ;прибавляем его к eax
incesi ;инкрементируем esi
cmpedi, esi; если esi равен edi,
je.point2 ;то переходим к.point2
muliss ; умножаем eax на основание входнойсистемы
jmp.point1; переход к.point1
point2:
cmpedx, 0; если старшее слово произведения не равно нулю,
переходк.errmax
cmpeax, 7fffffffh; если eax больше 7fffffffh,
ja.errmax ;то переход к.errmax
movecx, oss; посылаем в ecx основание выходной системы
xor esi, esi; очищаемesi
point3:
xoredx, edx ;очищаем edx (остаток от деления)
divecx ;делим eax на ecx
movBYTE ptr str[esi], dl; пересылаем остаток от деления в массив str
incesi ;инкрементируем esi
cmpeax, 0; если частное не равно нулю,
jne.point3;то переходим к.point3
movedx, esi ;сохраняем esi (количество элементов нового массива в edx)
xoresi, esi ;очищаем esi
movBYTE ptr [ebx], dl; сохраняем в память длинну массива
point4:
moval, BYTE ptr str [edx-1]; сохраняем символ из str в al (начиная с конца)
movBYTE ptr [ebx+esi+1], al; сохраняем его в исходном массиве
decedx ;уменьшаем edx на 1
incesi ;увеличиваем esi на 1
cmpedx, 0 ;если edx не равен нулю
jne.point4 ;то переходим к.point4
movdl, BYTE ptr [ebx]; копируем в dl длинну массива
movedi, edx; копируем в edi длину массива
point5:
cmpBYTE ptr [ebx+edi], 9; если элемент массива больше 9
ja.point6;то переходим к.point6
addBYTE ptr [ebx+edi], 30h; иначе прибавляем 30h
jmp.point7; переход к.point7
point6:
addBYTE ptr [ebx+edi], 57h; прибавляем к элементу массива 57h
point7:
decedi; декремент edi
cmpedi, 0; если edi не равен нулю
jne.point5;то переход к.point5
cmpecx, 2 ;если выходная система не равна 2
jne.oct1 ;то переходим к.oct1
'b'сохраняем
movBYTE ptr [ebx+esi+1], al ; в последний байт массива
addBYTE ptr [ebx], 1; и увеличиваем длину массива на 1
jmp.exitperepolnenie;переход на выход
oct1:
cmpecx, 8 ;если выходная система не равна 8
jne.hex1 ;то переходим к.hex1
moval, 'o' ;иначе 'o' сохраняем
movBYTE ptr [ebx+esi+1], al; в последний байт массива
addBYTE ptr [ebx], 1; и увеличиваем длину массива на 1
jmp.exitperepolnenie;переход на выход
hex1:
cmpecx, 16 ;если выходная система не равна 16
jne.exitperepolnenie;то переходим к.exitperepolnenie
moval, 'h' ;иначе 'h' сохраняем
movBYTE ptr [ebx+esi+1], al ; в последний байт массива
addBYTE ptr [ebx], 1; и увеличиваем длину массива на 1
jmp.exitperepolnenie;переход на выход
errmax:
movflag, 5; присваеваем flag код ошибки 5
exitperepolnenie:
popedi; возвращаем из стека edi
ret
perepolnenieendp
;##########################################################################
; ineax указатель на строку, edx разрядность выходной строки
; out флаг ошибки
public perevod
push eax
push ebx
push ecx
push edx
push edi
pushesi
movebx, eax; записываем в ebx указатель на строку
movoss, ecx; записываем в oss разрядность выходной строки
xoreax, eax; обнуляем eax
moval, BYTE PTR [ebx]; записываем в edi длину строки
movedi, eax; копируем в edi длину строки
cmpedi, 0; если длина строки равна нулю,
je.pustayastroka;то переходим к.pustayastroka
callinputss; определяем входную разрядность, результат в iss
cmpflag, 0; если флаг ошибки не равен нулю,
jne.exitperevod;то переход к.exitperevod
callverinput; переводим символы в массиве в цифры и проверяем правильность ввода
cmpflag, 0; если флаг ошибки не равен нулю,
jne.exitperevod;то переход к.exitperevod
callperepolnenie; проверяем на превышение максимальных значений и производимперевод числа
jmp.exitperevod;переход к.exitperevod
pustayastroka:
movflag, 1; присваеваем флагу код 1
exitperevod:
cmpflag, 0; если флаг равен нулю
je.end;то переход в конец
moveax, flag; копируем флаг в eax
movBYTE PTR [ebx], 1; устанавливаем длину строки в 1
movBYTE PTR [ebx+1], al; записываем в первый элемент массива код ошибки
end:
pop esi
pop edi
pop edx
pop ecx
pop eax
ret
perevod endp
end