РефератыИнформатика, программированиеПеПеревод чисел из различных систем счисления

Перевод чисел из различных систем счисления

Курсовая работа


На тему


"Перевод чисел из различных систем счисления"


Рязань 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 ('число введено неправильно')


elseifs[1]=#4 then


showmessage ('ноль не может быть первым символом числа')


elseifs[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


;##########################################################################


; in ebx указатель на строку, edi длина строки


; out iss выходная разрядность, flag код ошибки


inputss proc; процедура для определения входной системы счисления


public inputss


cmp BYTE PTR [ebx+edi], 30h; если последний элемент массива меньше 30h


jb. ErrInSS; то переход к. ErrInSS


cmp BYTE PTR [ebx+edi], 39h; если последний элемент массива больше 39h


ja.bin; то переход к.bin


mov iss, 10; иначе копируем 10 в iss


jmp.exitinputss; переход к.exitinputss


bin:


cmp BYTE PTR [ebx+edi], 62h; если последний элемент массива не равен 62h


jne.oct; то переход к.oct


mov iss, 2; иначе иначе копируем 2 в iss


jmp.mod; переходк.mod


oct:


cmp BYTE PTR [ebx+edi], 6fh; если последний элемент массива не равен 6fh


jne.hex; то переход к.hex


mov iss, 8; иначе иначе копируем 8 в iss


jmp.mod; переход к.mod


hex:


cmp BYTE PTR [ebx+edi], 68h; если последний элемент массива не равен 68h


jne. ErrInSS; то переход к. ErrInSS


mov iss, 16; иначе иначе копируем 16 в iss


jmp.mod; переход к.mod


mod:; если система счисления 2, 8 или 16


dec BYTE PTR [ebx]; то декремент системы счисления в паияти


dec edi; и в регистре edi


jmp.exitinputss; переход к.exitinputss


ErrInSS:


mov flag, 2; присваеваем flag код ошибки 2


exitinputss:


ret


inputss endp


; #########################################################################


; in iss входная разрядность, ebx указатель на строку, edi длина строки


; out flag флаг ошибки


verinput proc; процедура проверки правельности ввода


public verinput


push edi


push eax


je.null; то переход к.null


mov eax, iss; копируем основание системы счисления в eax


cmp eax, 16; если основание системы счисления равно 16


je.hexver; то переход к.hexver


ver:


sub BYTE ptr [ebx+edi], 30h; вычитаем из элемента массива 30h


jb.errinput; если результат меньше 0, то переход к.errinput


cmp BYTE ptr [ebx+edi], al; если результат больше или равен основанию системы счисления


jae.errinput; то переход к.errinput


dec edi; декремент edi


cmp edi, 0; если edi не равен нулю


jmp.exitverinput; переход.exitverinput


hexver:


sub BYTE ptr [ebx+edi], 30h; вычитаем из элемента массива 30h


jb.errinput; если результат меньше 0, то переход к.errinput


cmp BYTE ptr [ebx+edi], 10; если результат меньше 10


jb.p2; то переход к.p2 (если символ в диапазоне 0..9)


sub BYTE ptr [ebx+edi], 7h; вычитаем из элемента массива 7h


cmp BYTE ptr [ebx+edi], 10; если результат меньше 10


jb.errinput; если результат меньше 10, то переход к.errinput


cmp BYTE ptr [ebx+edi], 10h; если результат меньше 10


sub BYTE ptr [ebx+edi], 20h; вычитаем из элемента массива 20h


jb.errinput; если результат меньше 0, то переход к.errinput


jb.p2; то переход к.p2 (если символ в диапазоне a..f)


jmp.errinput; иначе переход к.errinput


errinput:


mov flag, 3; присваеваем flag код ошибки 3


jmp.exitverinput; переход к.exitverinput


p2:


dec edi; декремент edi


cmp edi, 0; если edi не равен нулю


jne.hexver; то переход к.hexver


jmp.exitverinput; иначе переход к.exitverinput


null:


mov flag, 4; присваеваем flag код ошибки 4


exitverinput:


pop eax


pop edi


ret


verinput endp


;#########################################################################


; in iss входная разрядность, ebx указатель на строку, edi длина строки, oss выходная; разрядность


; out


perepolnenie proc; проверка превышения максимальных значений и окончание перевода


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


add eax, ecx ; прибавляем его к eax


inc esi ; инкрементируем esi


cmp edi, esi; если esi равен edi,


je.point2 ; то переходим к.point2


mul iss ; умножаем eax на основание входной системы


jmp.point1; переходк.point1


point2:


cmp edx, 0 ; если старшее слово произведения не равно нулю,


переход к.errmax


cmp eax, 7fffffffh; если eax больше 7fffffffh,


ja.errmax ; то переход к.errmax


mov ecx, oss; посылаем в ecx основание выходной системы


xor esi, esi; очищаем esi


point3:


xor edx, edx ; очищаем edx (остаток от деления)


div ecx ; делим eax на ecx


mov BYTE ptr str[esi], dl; пересылаем остаток от деления в массив str


inc esi ; инкрементируем esi


cmp eax, 0; если частное не равно нулю,


jne.point3; то переходим к.point3


mov edx, esi ; сохраняем esi (количество элементов нового массива в edx)


xor esi, esi ; очищаем esi


mov BYTE ptr [ebx], dl; сохраняем в память длинну массива


point4:


mov al, BYTE ptr str [edx-1]; сохраняем символ из str в al (начиная с конца)


mov BYTE ptr [ebx+esi+1], al ; сохраняем его в исходном массиве


dec edx ; уменьшаем edx на 1


inc esi ; увеличиваем esi на 1


cmp edx, 0 ; если edx не равен нулю


jne.point4 ; то переходим к.point4


mov dl, BYTE ptr [ebx]; копируем в dl длинну массива


mov edi, edx; копируем в edi длину массива


point5:


cmp BYTE ptr [ebx+edi], 9; если элемент массива больше 9


ja.point6; то переходим к.point6


add BYTE ptr [ebx+edi], 30h; иначе прибавляем 30h


jmp.point7; переходк.point7


point6:


add BYTE ptr [ebx+edi], 57h; прибавляем к элементу массива 57h


point7:


dec edi; декремент edi


cmp edi, 0; если edi не равен нулю


jne.point5; то переход к.point5


cmp ecx, 2 ; если выходная система не равна 2


jne.oct1 ; то переходим к.oct1


'b' сохраняем


mov BYTE ptr [ebx+esi+1], al ; в последний байт массива


add BYTE ptr [ebx], 1; и увеличиваем длину массива на 1


jmp.exitperepolnenie ; переход на выход


oct1:


cmp ecx, 8 ; если выходная система не равна 8


jne.hex1 ; то переходим к.hex1


mov al, 'o' ; иначе 'o' сохраняем


mov BYTE ptr [ebx+esi+1], al; в последний байт массива


add BYTE ptr [ebx], 1; и увеличиваем длину массива на 1


jmp.exitperepolnenie ; переход на выход


hex1:


cmp ecx, 16 ; если выходная система не равна 16


jne.exitperepolnenie ; то переходим к.exitperepolnenie


mov al, 'h' ; иначе 'h' сохраняем


mov BYTE ptr [ebx+esi+1], al ; в последний байт массива


add BYTE ptr [ebx], 1; и увеличиваем длину массива на 1


jmp.exitperepolnenie ; переход на выход


errmax:


mov flag, 5; присваеваем flag код ошибки 5


exitperepolnenie:


pop edi; возвращаем из стека edi


ret


perepolnenie endp


;##########################################################################


; in eax указатель на строку, edx разрядность выходной строки


; out флагошибки


public perevod


push eax


push ebx


push ecx


push edx


pushedi


push esi


mov ebx, eax; записываем в ebx указатель на строку


mov oss, ecx; записываем в oss разрядность выходной строки


xor eax, eax; обнуляем eax


mov al, BYTE PTR [ebx]; записываем в edi длину строки


mov edi, eax; копируем в edi длину строки


cmp edi, 0; если длина строки равна нулю,


je.pustayastroka; то переходим к.pustayastroka


call inputss; определяем входную разрядность, результат в iss


cmp flag, 0; если флаг ошибки не равен нулю,


jne.exitperevod; то переход к.exitperevod


call verinput; переводим символы в массиве в цифры и проверяем правильность ввода


cmp flag, 0; если флаг ошибки не равен нулю,


jne.exitperevod; то переход к.exitperevod


call perepolnenie; проверяем на превышение максимальных значений и производим перевод числа


jmp.exitperevod; переход к.exitperevod


pustayastroka:


mov flag, 1; присваеваем флагу код 1


exitperevod:


cmp flag, 0; если флаг равен нулю


je.end; то переход в конец


mov eax, flag; копируем флаг в eax


mov BYTE PTR [ebx], 1; устанавливаем длину строки в 1


mov BYTE PTR [ebx+1], al; записываем в первый элемент массива код ошибки


end:


pop esi


pop edi


pop edx


pop ecx


pop eax


ret


perevod endp


end

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Перевод чисел из различных систем счисления

Слов:2821
Символов:26617
Размер:51.99 Кб.