Перевод из десятичного формата в шестнадцатеричный (оконное приложение) - 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
;==========================================

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы