Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
ОвчинниВики
1 / 1 / 3
Регистрация: 04.03.2017
Сообщений: 91
1

Перевод из десятичного формата в шестнадцатеричный (оконное приложение)

27.11.2017, 21:20. Просмотров 1102. Ответов 21

Перевести число, введенное в десятичном формате в шестнадцатеричное. Программирование оконных приложений, нужно сделать графическое приложение на языке Assembler. Вводишь число в десятичном виде, вывод получаешь в шестнадцатеричном. Если ввёл неправильный символ, то ошибка. Помогите с реализацией. Проблема с валидатором. Проверить нужно правильно ли введено число, в цифровом формате ли. Пожалуйста, очень нужна помощь)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2017, 21:20
Ответы с готовыми решениями:

Перевод времени из десятичного формата в 64 битное
Необходимо в разных форматах вводить и отображать временные отметки. Вводить: 1) 64 битное число и...

Перевод в шестнадцатеричный формат
А как в VBA перевести число в шестнадцатеричный формат? как то при помощи вот такой строчки?...

Перевод обычного текста в шестнадцатеричный
Нужно программно сделать конвертер шестнадцатеричного текста. Например, существует два...

Перевод в шестнадцатеричный ХТМЛ'овский цвет
Как перевести число возвращаемое функцией Point(X,Y) в шестнадцатеричный ХТМЛ'овский цвет? т.е....

Деление двоичных цифр и перевод в шестнадцатеричный вид
Всем привет. Нуждаюсь в помощи. Собираю работу по сигнатурному анализатору, и думаю вместе со...

21
ОвчинниВики
1 / 1 / 3
Регистрация: 04.03.2017
Сообщений: 91
19.12.2017, 07:20  [ТС] 21
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
format PE GUI 4.0                        ; 32-разрЯдное оконное приложение WINDOWS EXE
entry start                          ; точка входа
;Ввожу число она мне его выведет на табличке, без 16-ого перевода пока
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 ob1
                       ; запустить валидатор для проверки на число
ERR_MSG:
    invoke MessageBox,HWND_DESKTOP,MESSAGE_ERR,number,0      ; сообщение об ошибке
 exit:
    mov esi, result_lwr
    invoke MessageBox,HWND_DESKTOP,esi,number,0      ; вывод результата
    invoke ExitProcess,0
    ; завершить выполнение програм
ob1:
    xor ecx,ecx   
    ccall [strlen], message                  ; узнать длину введенной пользователем строки
    mov ecx, eax
    cld                         ;флаг переноса обнулить
    inc ecx
    mov esi, message      ; адрес текста
    push esi
compare:
    ; *** сравнение строк ***
    dec ecx                         ;каждый раз уменьшать количество символов
    jecxz exit
    lodsb                           ;загрузить бит - символ из строки
    cmp al, '0'
    ja is_lower
    ;lodsw
    ;cmp ax, '10'
    ;ja is_upper
other_symbol:
    mov edi, result_lwr
    add edi, [LEN]
    stosb
 
    inc [LEN]
    jmp compare
 
is_lower:
    cmp al, '9'
    jb other_symbol
    mov edi, result_lwr
    add edi, [LEN]
    stosb
 
    inc [LEN]
    jmp compare
 
;is_upper:
    ;cmp ax, '15'
    ;jb other_symbol
    ;add al, A'-10
    ;mov edi, result_lwr
    ;add edi, [LEN]
    ;stosb
 
    ;inc [LEN]
    ;jmp compare
 
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 GetDlgItemInt,[hwnddlg],ID_MESSAGE,oStr,10  ; получение текста сообщениЯ
    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
  number db "Number is",0
  sixnumber dd 0
 ;const db 10
  MESSAGE_ERR db "NUMBER INVALID",0
  message rb 100h
  result_lwr db 250 dup(0)
  result_upr db 250 dup(0)
  LEN dd 0
 
section '.idata' import data readable writeable          ; секциЯ импортируемых функций
 
  library kernel,'KERNEL32.DLL',\
      user,'USER32.DLL',\
      msvcrt,'msvcrt.dll',\
       gdi32,'GDI32.DLL',\
    advapi32,'ADVAPI32.DLL',\
    comctl32,'COMCTL32.DLL',\
    comdlg32,'COMDLG32.DLL',\
    shell32,'SHELL32.DLL',\
    wsock32,'WSOCK32.DLL'
 
  import kernel,\
     GetModuleHandle,'GetModuleHandleA',\
     ExitProcess,'ExitProcess'
 
  import user,\
     DialogBoxParam,'DialogBoxParamA',\
     GetDlgItemText,'GetDlgItemTextA',\
     MessageBox,'MessageBoxA',\
     EndDialog,'EndDialog'
 
  import  msvcrt,\
     strlen,'strlen',\
     printf,'printf',\
     sprintf,'sprintf'
section '.rsrc' resource data readable               ; секциЯ объЯвлениЯ ресурсов
 
  directory RT_DIALOG,dialogs
 
  resource dialogs,0,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration
 
  dialog demonstration,'Correct number',70,70,190,55,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    dialogitem 'STATIC','&Enter number:',-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 number',ID_OK,70,37,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
  enddialog
0
ФедосеевПавел
Модератор
4319 / 2392 / 956
Регистрация: 01.02.2015
Сообщений: 7,891
19.12.2017, 07:38 22
Пробежался взглядом - ввод строки и её проверка на корректность (все символы - цифры).

Вопрос в чём?

Добавлено через 4 минуты
Вы можете просто скопировать текст из моего сообщения, изменив названия переменных?
Assembler
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
        ;обработка строки
        ;-преобразование строки в число
        mov     ecx,    [LenString]
        lea     esi,    [TestString]
        mov     eax,    0               ;итоговое число
        mov     ebx,    10              ;система счисления
        jcxz    @@Error_atoi            ;при нулевой длине строки
        @@For_atoi:
                mul     ebx
                cmp     edx,    0
                jne     @@Error_atoi    ;при переполнении размера двойное слово
                mov     dl,     [esi]
                inc     esi
                sub     dl,     '0'
                jl      @@Error_atoi    ;при нецифровом символе
                cmp     dl,     9
                ja      @@Error_atoi    ;при нецифровом символе
                add     eax,    edx
        loop    @@For_atoi
        jmp     @@End_atoi
@@Error_atoi:
        mov     eax,    0
        invoke  WriteConsole, hConsoleOutput, ADDR aszNoValid,\
                LENGTHOF aszNoValid - 1, ADDR BufLen, NULL
@@End_atoi:
        mov     [X],    eax
 
        ;преобразование числа в строку с 16-ричным представлением числа
        mov     ecx,    (sizeof X)*2            ;на каждый байт приходится 2 символа
        mov     eax,    [X]
        lea     edi,    [Buffer]
        mov     [BufLen],       ecx
 
        @@For_HexStr:
                rol     eax,    4;       преобразуемое число в регистре eax
                push    eax
                and     al,     0Fh
                cmp     al,     10
                mov     ah,     0
                cmc
                sbb     ah,     0
                and     ah,     'A'-'9'-1
                add     al,     '0'
                add     al,     ah
 
                stosb                   ; помещаем значение из AL в строку
                pop     eax
        loop    @@For_HexStr
        mov     al,     0
        stosb
За исключением названий переменных, способов вызова процедур (в том числе WinAPI) всё остальное должно компилироваться в FASM.

Добавлено через 5 минут
Или доработайте программу R71MT - из 13-го сообщения.
Добавьте вместо строки 38 код преобразования в 16-ричную строку.
0
19.12.2017, 07:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2017, 07:38

Оконное приложение
Доброй ночи!!! Как VS создать оконное приложение какой проект выбрать? Хочу добавить кнопки и место...

Оконное приложение g++
Как на g++ писать оконные приложения?

Оконное приложение на C++
Товарищи программисты, помогите пожалуйста перейти с делфи на с++. Для начала хочется создать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru