p align="left">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 ;########################################################################## ; 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
Страницы: 1, 2
|