50053 (Перевод чисел из различных систем счисления), страница 2

2016-07-30СтудИзба

Описание файла

Документ из архива "Перевод чисел из различных систем счисления", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "50053"

Текст 2 страницы из документа "50053"

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

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

; 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

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

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4144
Авторов
на СтудИзбе
666
Средний доход
с одного платного файла
Обучение Подробнее