Получить число из поля 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

Объяснение кода листинга программы

Список элементов:

  1. В первой строке функции IntegerIn подключаются регистры ebx, edx и esi.
  2. Далее, в eax устанавливается ноль.
  3. Следующим шагом, esi устанавливается на значение string+4, где string - это строка, в которой нужно найти число.
  4. Затем, проверяется знак числа: если оно отрицательное, то устанавливается флаг negflag.
  5. Далее, проверяется знак числа: если оно положительное, то увеличивается значение esi на 3 (чтобы пропустить знак и пробел).
  6. Если число больше или равно десяти, то происходит переход к блоку im1, иначе, к блоку im2.
  7. В блоке im1 происходит проверка на символ '$'. Если он есть, то происходит переход к блоку ierr, иначе, происходит проверка на числа от 0 до 9.
  8. Если число меньше 10, то оно муллируется на 10 и вычитается из символа в esi.
  9. К результату добавляется значение символа в esi.
  10. Значение si увеличивается на 1.
  11. Происходит переход к блоку im1.
  12. В блоке ierr происходит проверка флага negflag. Если он установлен, то значение eax отрицается.
  13. Затем, происходит переход к блоку iex, иначе, происходит переход к блоку im.
  14. В блоке iex происходит вывод сообщения об ошибке.
  15. В конце функции, регистры ebx, edx и esi освобождаются, а eax возвращается.

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

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