Определение стратегии руководства перерабатывающего предприятия по сезонному набору силы с учетом ра...
Курсовая работа
На тему
"Перевод чисел из
различных систем счисления"
Рязань 2009
В данной
курсовой работе возникает задача разработки приложения, позволяющего выполнять
перевод чисел из различных систем счисления, с применением средств ассемблера
процессора x86.
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
Единая
система программной документации. Схемы алгоритмов, программ, данных и систем.
Условные обозначения и правила выполнения
Программа
служит для перевода
чисел из систем счисления с основанием 2, 8, 10, 16.
В
программе организация входных данных осуществляется в виде поля для ввода числа
и переключателей для выбора системы счисления. Организация выходных данных
осуществляется в виде метки.
В
программе обеспечивается контроль правильности ввода числа. Если число введено
не корректно, то выводится сообщение об ошибке.
2. Описание разработанной программы
Наименование
и обозначение программы «perevod».
Для
выполнения программы необходима ОS Windows 9x/2000/XP/vista/7
Программа
написана с использованием Delphi 7, TASM32.
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
При
выполнении данной курсовой работы используется персональный компьютер поколения
Intel. Данный компьютер оснащен всеми устройствами необходимыми для работы в
среде разработки Delphi 7, и последующем запуске полученных программ.
Для
программы входными данными являются строка edit1.text и переключатели
radiobutton1, radiobutton2, radiobutton3, radiobutton4.
В
программе выходными данными будет являться строка label1.caption.
Объектами
испытаний являются три разработанных приложения: perevod.exe.
Целью
испытаний данных приложений является выяснение возможных ошибок во время
выполнения программы, которые не были обнаружены на стадии разработки.
Программы
должны надежно работать и выполнять свои функции при любых возможных наборах
исходных данных, выдавая результат за конечное время.
Техническое задание – ГОСТ 19.201–78
Программа и методика испытаний – ГОСТ 19.301–79
Текст программы – ГОСТ 19.401–78
Описание программы – ГОСТ 19.402–78
Для проведения испытаний используется IBM-совместимый персональный компьютер с операционной системой семейства Windows.
·
Входные данные:
строка: «»
переключатель: десятичная
Результат: сообщение «пустая строка»
·
Входные данные:
строка: «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
Программа
служит для перевода
чисел из систем счисления с основанием 2, 8, 10, 16. Для того чтобы программа
работала и выполняла соответствующие функции, компьютер должен иметь
определенные технические средства, а именно:
1) Windows 9x/2000/Me/Xp
2) Процессор не ниже PENTIUM 2 400
3) ОП 64 мб
Для
запуска программы необходимо запустить приложение «perevod.exe».
Для
программы входными данными являются число и переключатели.
Выходным
данным будет число, переведенное в систему счисления.
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;
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
;##########################################################################
; 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]; то декремент системы счисления в паияти
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 на основание входной
системы
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 edi
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