Перевод из десятичного формата в шестнадцатеричный (оконное приложение) - Assembler
Формулировка задачи:
Перевести число, введенное в десятичном формате в шестнадцатеричное.
Программирование оконных приложений, нужно сделать графическое приложение на языке Assembler. Вводишь число в десятичном виде, вывод получаешь в шестнадцатеричном. Если ввёл неправильный символ, то ошибка. Помогите с реализацией. Проблема с валидатором. Проверить нужно правильно ли введено число, в цифровом формате ли. Пожалуйста, очень нужна помощь)format PE GUI 4.0 ; 32-разрЯдное оконное приложение WINDOWS EXE entry start ; точка входа include 'include\win32a.inc' ID_MESSAGE = 102 ID_OK = 103 section '.text' code readable executable ; секциЯ кода start: invoke GetModuleHandle,0 ; получить уникальный идентификатор активного программного модулЯ invoke DialogBoxParam,eax,0,HWND_DESKTOP,DialogProc,0 ; запустить цикл обработки сообщений для сктивного программного модулЯ or eax,eax ; если диалог вернул 1 то... jz exit ccall [strlen], message ; узнать длину введенной строки cmp eax, 0 ; если длина меньше минимальной, вывести ошибку jb ERR_MSG jmp validateNumber numberGood: ; если число корректн, перевести в шестнадцатиричную систему xor eax, eax mov edi,bin mov ebx,[a] mov ecx,16 ob1: shl bx,1 ;перевод из десятичной системы в hex jc ob2 mov al,'0' jmp ob3 ИЛИ ob1: mov al, '0' rcl bx,1 adc al, 0 ob2: mov al,'1' ob3: stosb loop ob1 invoke MessageBox,HWND_DESKTOP,esi,date,0 ; ...вывести сообщение invoke printf,msg3,[a],bin,0 ;выводим результат jmp exit ; запустить валидатор для проверки на число ERR_MSG: invoke MessageBox,HWND_DESKTOP,MESSAGE_ERR,number,0 ; сообщение об ошибке exit: invoke ExitProcess,0 ; завершить выполнение программы [B]validateNumber:[/B] xor eax, eax ; валидатор для числа xor ebx, ebx mov esi, message ; скопировать адрес строки в регистр ESI [B];проверка на то, что введено число?[/B] jmp numberGood ; если все проверки пройдены, напечатать число в 16 proc DialogProc hwnddlg,msg,wparam,lparam ; оконнаЯ функциЯ обработки сообщений push ebx esi edi cmp [msg],WM_INITDIALOG ; сообщение предшествующее оторажению окна je .wminitdialog cmp [msg],WM_COMMAND ; сообщение отправлЯемое при нажатии на кнопки, меню и т.п. je .wmcommand cmp [msg],WM_CLOSE ; сообщение отправлЯемое перед закрытием окна je .wmclose xor eax,eax ; если сообщение не обработано возвращаем 0 jmp .finish .wminitdialog: jmp .processed .wmcommand: cmp [wparam],BN_CLICKED shl 16 + ID_OK ; если нажата кнопка OK jne .processed invoke GetDlgItemText,[hwnddlg],ID_MESSAGE,message,100h ; получение текста сообщениЯ invoke EndDialog,[hwnddlg],1 ; закрыть окно и вернуть вызвавшей программе 1 jmp .processed .wmclose: invoke EndDialog,[hwnddlg],0 ; закрыть окно и вернуть вызвавшей программе 0 .processed: mov eax,1 ; если сообщение обработано возвращаем 1 .finish: pop edi esi ebx ret endp section '.bss' readable writeable ; секциЯ данных integer db "%d",0 number dd 0 bin db '0000000000000000',0 const db 10 MESSAGE_ERR db "NUMBER INVALID",0 message rb 100h section '.text' code readable executable enter_num: invoke printf,msg1 invoke scanf,integer,a mov edi,bin mov ebx,[a] mov ecx,16 ob1: shl bx,1 ;перевод из десятичной системы в hex jc ob2 mov al,'0' jmp ob3 ИЛИ ob1: mov al, '0' rcl bx,1 adc al, 0 ob2: mov al,'1' ob3: stosb loop ob1 invoke printf,msg3,[a],bin,0 ;выводим результат invoke getch cmp eax,27 jnz enter_num invoke ExitProcess, 0 ;выход из программы section '.idata' import data readable writeable ; секциЯ импортируемых функций library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ msvcrt,'msvcrt.dll' import kernel,\ GetModuleHandle,'GetModuleHandleA',\ ExitProcess,'ExitProcess' import user,\ DialogBoxParam,'DialogBoxParamA',\ GetDlgItemText,'GetDlgItemTextA',\ MessageBox,'MessageBoxA',\ EndDialog,'EndDialog' import msvcrt,\ strlen,'strlen' section '.rsrc' resource data readable ; секциЯ объЯвлениЯ ресурсов directory RT_DIALOG,dialogs resource dialogs,0,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration dialog demonstration,'Correct date',70,70,190,55,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME dialogitem 'STATIC','&Enter date:',-1,10,10,70,8,WS_VISIBLE dialogitem 'EDIT','',ID_MESSAGE,10,20,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL dialogitem 'BUTTON','Check date',ID_OK,70,37,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON enddialog
Решение задачи: «Перевод из десятичного формата в шестнадцатеричный (оконное приложение)»
textual
Листинг программы
format PE GUI 4.0 include 'win32ax.inc' include 'encoding\win1251.inc' ; для кирилицы .data iBuf db 16 dup 0 ; буфер для ввода oBuf dd 0 ; здесь будет ввод в DEC oStr db 32 dup(0) ; сюда 'wsprintf' сбросит строку для вывода в HEX ID_box = 2018 ; номер бокса для ресурсов (любое число - Новый год) .code start: invoke DialogBoxParam,0,38,0,myFunc,0 ; зовём окно для ввода числа! ; введённый текст в "inBuf"! (строка заканчивается нулём) ; проверяем строку на число, и сразу переводим в DEC ;-------- xor ecx,ecx ; здесь будем копить число DEC mov ebx,10 ; множитель системы-счисления mov esi,iBuf ; адрес текста @find: lodsb ; AL - очередной символ из ESI or al,al ; конец строки? (ноль) jz @ok ; да - закончить! cmp al,'0' ; фильтр чисел... jb @err ; ^^^ cmp al,'9' ; ^^^ ja @err ; ошибка! - если не число and eax,0Fh ; иначе: переводим символ в цифру xchg eax,ecx ; меняем последнее и предыдущее число mul ebx ; умножаем EAX на EBX (произведение в EАХ) add ecx,eax ; прибавляем его к ECX. jmp @find ; повторить для всех символов в буфере... ; 10-тичный ввод лежит сейчас в ECX. ; переводим его в строковый HEX-формат, ; и сбрасываем результат в буфер "oStr" для вывода на экран ;-------- @ok: cinvoke wsprintf, oStr, <'Результат HEX = %X',0>, ecx invoke MessageBox,0,oStr,'НЕХ конвертор',MB_OK ; вывод в окошко!!! jmp @exit @err: invoke MessageBox,0,'Ошибка ввода!!!','НЕХ конвертор',MB_OK @exit: invoke ExitProcess,0 ;------------8<-----------------8<--------------8<------------------- ; Обработчик окна-ввода -------------------------// proc myFunc, hwnddlg, msg, wparam, lparam ; смотрим, какое сообщение посылает нам окно ;-------- cmp [msg],WM_COMMAND ; какая-то команда? (меню, орган упр, клавиша) je @Begin ; cmp [msg],WM_CLOSE ; ..или крестик в правом углу? je @Close ; xor eax,eax ; ни-то, ни другое (нужно сбросить EAX)... jmp @Close ; ; смотрим, какие кнопки юзаются (у меня только "ОК") ;-------- @Begin: cmp [wparam],BN_CLICKED shl 16 + IDOK jne @Close ; читаем 10 символов из бокса в буфер ;-------- invoke GetDlgItemText,[hwnddlg],ID_box,iBuf,10 invoke EndDialog,[hwnddlg],1 @Close: ret endp ;-------------------------------------- ; Cекция ресурсов с описанием нашего окна. ; Цифры - координаты контролов в окне ;-------- section '.rsrc' resource data readable directory RT_DIALOG,dialogs resource dialogs,38,LANG_ENGLISH,rsrc_dialog dialog rsrc_dialog,'НЕХ конвертор',300,200,130,60,WS_CAPTION dialogitem 'STATIC','Число:',-1,15,10,30,10,WS_VISIBLE dialogitem 'EDIT','',ID_box,15,20,100,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP dialogitem 'BUTTON','ОК',IDOK,45,40,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON enddialog .end start ;==========================================
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д