Получить число из поля EDIT - Assembler
Формулировка задачи:
Как вытащить число с поля созданного допустим так:
Почему то только текст можно вытащить
;создать поле редактирования PUSH 0 PUSH HINST PUSH 0 PUSH DWORD PTR [EBP+08H] PUSH 20 ; DY PUSH 60 ; DX PUSH 50 ; Y PUSH 10 ; X PUSH STYLEDT PUSH OFFSET CPEDT ;имя окна PUSH OFFSET CLSEDIT ;имя класса PUSH 0 CALL CreateWindowExA@48 MOV HWNDEDT1,EAX
;получить отредактированную строку PUSH OFFSET msg1 PUSH 150 PUSH WM_GETTEXT PUSH HWNDEDT1 CALL SendMessageA@16
Решение задачи: «Получить число из поля EDIT»
textual
Листинг программы
IntegerIn proc im: push ebx push edx push esi xor eax, eax lea esi, string+4 mov negflag, eax cmp dword ptr [esi], '-' jne im2 not negflag inc esi jmp im1 im2: cmp dword ptr [esi], '+' jne im1 inc esi inc esi im1: cmp dword ptr [esi], '$' je iex1 cmp dword ptr [esi], '0' jb ierr cmp dword ptr [esi], '9' ja ierr mov ebx, 10 mul ebx sub dword ptr [esi], '0' add al, [esi] adc ah,0 inc si jmp im1 ierr: ;print errmsg jmp im iex1: cmp negflag, 0 je iex neg eax iex: pop esi pop edx pop ebx ret IntegerIn endp
Объяснение кода листинга программы
Список элементов:
- В первой строке функции
IntegerIn
подключаются регистрыebx
,edx
иesi
. - Далее, в
eax
устанавливается ноль. - Следующим шагом,
esi
устанавливается на значениеstring+4
, гдеstring
- это строка, в которой нужно найти число. - Затем, проверяется знак числа: если оно отрицательное, то устанавливается флаг
negflag
. - Далее, проверяется знак числа: если оно положительное, то увеличивается значение
esi
на 3 (чтобы пропустить знак и пробел). - Если число больше или равно десяти, то происходит переход к блоку
im1
, иначе, к блокуim2
. - В блоке
im1
происходит проверка на символ '$'. Если он есть, то происходит переход к блокуierr
, иначе, происходит проверка на числа от 0 до 9. - Если число меньше 10, то оно муллируется на 10 и вычитается из символа в
esi
. - К результату добавляется значение символа в
esi
. - Значение
si
увеличивается на 1. - Происходит переход к блоку
im1
. - В блоке
ierr
происходит проверка флагаnegflag
. Если он установлен, то значениеeax
отрицается. - Затем, происходит переход к блоку
iex
, иначе, происходит переход к блокуim
. - В блоке
iex
происходит вывод сообщения об ошибке. - В конце функции, регистры
ebx
,edx
иesi
освобождаются, аeax
возвращается.