Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2010, 12:38   #1
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
По умолчанию FASM. Ввод чисел и математические операции.

Имеется код для FASM для ввода числа и вывода его в месседжБокс. Как перевести строку в число, чтобы программа решала простые примеры типа а+1= ?
Код:
format PE GUI 4.0
entry start
include 'win32a.inc'
IDC_EDIT1 = 100
IDC_EDIT2 = 101
IDC_BUTTON = 102
section '.data' data readable writeable
  _class       db 'GetNumberClass',0
  _title       db 'Ввод числа',0
  _edit1        db 'edit',0
  _button      db 'button',0
  _button_tit  db 'Нажми меня',0
  _error       db 'Ошибка создания окна',0
  _error_num   db 'Сначала введите число до 8 знаков',0
  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
section '.data?' data readable writeable
  msg           MSG
  hEdit         dd    ?
  flag          dd    ?
  iVar          dd    ?
  buf           rd    256
section '.code' code readable executable
  start:
        invoke  GetModuleHandle,0
        mov     [wc.hInstance],eax
        invoke  LoadIcon,0,IDI_APPLICATION
        mov     [wc.hIcon],eax
        invoke  LoadCursor,0,IDC_ARROW
        mov     [wc.hCursor],eax
        invoke  RegisterClass,wc
        test    eax,eax
        jz      error
        invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,
         128,256,192,NULL,NULL,[wc.hInstance],NULL
        test    eax,eax
        jz      error
  msg_loop:
        invoke  GetMessage,msg,NULL,0,0
        cmp     eax,1
        jb      end_loop
        jne     msg_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop
  error:
        invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
  end_loop:
        invoke  ExitProcess,[msg.wParam]
proc WindowProc hwnd,wmsg,wparam,lparam
        push    ebx esi edi
        cmp     [wmsg],WM_CREATE
        je      .wmcreate
        cmp     [wmsg],WM_COMMAND
        je      .wmcommand
        cmp     [wmsg],WM_DESTROY
        je      .wmdestroy
  .defwndproc:
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
        jmp     .ret
  .wmcreate:
        invoke  CreateWindowEx,WS_EX_CLIENTEDGE,_edit1,0,
    WS_VISIBLE+WS_CHILDWINDOW+ES_NUMBER+ES_AUTOHSCROLL+WS_TABSTOP+ES_NOHIDESEL,
    10,10,100,20,[hwnd],IDC_EDIT1,[wc.hInstance],NULL
        mov     [hEdit],eax
        invoke  SetFocus,eax
        invoke  SendMessage,[hEdit],EM_SETLIMITTEXT,8,0
        invoke  CreateWindowEx,0,_button,_button_tit,WS_VISIBLE+WS_CHILDWINDOW+BS_DEFPUSHBUTTON+WS_TABSTOP,
     120,10,120,50,[hwnd],IDC_BUTTON,[wc.hInstance],NULL
        jmp     .finish
  .wmcommand:
        mov     eax,[wparam]
        cmp    eax,IDC_BUTTON
        jne     .finish
        invoke  GetDlgItemInt,[hwnd],IDC_EDIT1,flag,1
        cmp     [flag],1
        je      .numok1
        invoke  MessageBox,[hwnd],_error_num,_title,MB_ICONINFORMATION+MB_OK
        invoke  SetFocus,[hEdit]
        jmp     .finish
        .numok1:
        mov     [buf],eax
        invoke  GetDlgItemText,[hwnd],IDC_EDIT1,buf,16

        ;add [buf],2 Вот на этом месте запнулся, если прибавлять просто к ;содержимому буфера отображаются аски-символы как я понял.
        invoke  MessageBox,[hwnd],buf,_title,MB_OK
  .wmdestroy:
        invoke  PostQuitMessage,0
  .finish:
        xor     eax,eax
  .ret:
        pop     edi esi ebx
        ret
endp
section '.idata' import data readable writeable
  library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
         ; user32,'USER32.DLL'
  include 'api\kernel32.inc'
  include 'api\user32.inc'
Заранее спасибо.

Последний раз редактировалось rpy3uH; 07.01.2010 в 14:02.
Lamo вне форума Ответить с цитированием
Старый 07.01.2010, 14:03   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

преобразование строки в число и числа в строку
rpy3uH вне форума Ответить с цитированием
Старый 09.01.2010, 11:38   #3
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
По умолчанию

Расскажите пожалуйста как и куда впихать код для перевода строк в числа.
Lamo вне форума Ответить с цитированием
Старый 17.01.2010, 20:38   #4
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
Смех

Снова приходиться отвечать на свой вопрос самому. С кодом программы помог Игорь Лысков. Большое ему за это спасибо.
Вот рабочий код программы, вычисляющей значение а + 1 = .

Код:
;------------------------------------------------------------------------------------------------------
format PE GUI 4.0
entry start

include 'win32a.inc'

IDC_EDIT = 100
IDC_BUTTON = 101

section '.data' data readable writeable

_class db 'GetNumberClass',0
_title db 'Ввод числа',0
_edit db 'edit',0
_button db 'button',0
_button_tit db 'Нажми меня',0
_error db 'Ошибка создания окна',0
_error_num db 'Сначала введите число до 8 знаков',0
_format db '%d + 1 = %d',0

wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class

section '.data?' data readable writeable

msg MSG
hEdit dd ?
flag dd ?
iVar dd ?
_buf rd 64

section '.code' code readable executable

start:
 invoke GetModuleHandle,0
 mov [wc.hInstance],eax
 invoke LoadIcon,0,IDI_APPLICATION
 mov [wc.hIcon],eax
 invoke LoadCursor,0,IDC_ARROW
 mov [wc.hCursor],eax
 invoke RegisterClass,wc
 test eax,eax
 jz error

 invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,
   128,128,270,192,NULL,NULL,[wc.hInstance],NULL
 test eax,eax
 jz error

msg_loop:
 invoke GetMessage,msg,NULL,0,0
 cmp eax,1
 jb end_loop
 jne msg_loop
 invoke TranslateMessage,msg
 invoke DispatchMessage,msg
 jmp msg_loop

error:
 invoke MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

end_loop:
 invoke ExitProcess,[msg.wParam]

proc WindowProc uses ebx esi edi,hwnd,wmsg,wparam,lparam
 cmp [wmsg],WM_CREATE
 je .wmcreate
 cmp [wmsg],WM_COMMAND
 je .wmcommand
 cmp [wmsg],WM_DESTROY
 je .wmdestroy
.defwndproc:
 invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
 jmp .ret

.wmcreate:
;создадим редактор (стиль ES_NUMBER - ждем число)
 invoke CreateWindowEx,WS_EX_CLIENTEDGE,_edit,0,
    WS_VISIBLE+WS_CHILDWINDOW+ES_NUMBER+ES_AUTOHSCROLL+ES_NOHIDESEL,
    10,10,100,20,[hwnd],IDC_EDIT,[wc.hInstance],NULL
 mov [hEdit],eax
;дадим ему фокус ввода
 invoke SetFocus,eax
;ограничимся числом с 8 знаками
 invoke SendMessage,[hEdit],EM_SETLIMITTEXT,8,0
;создадим кнопку
 invoke CreateWindowEx,0,_button,_button_tit,WS_VISIBLE+WS_CHILDWINDOW+BS_DEFPUSHBUTTON,
    10,40,100,20,[hwnd],IDC_BUTTON,[wc.hInstance],NULL
 jmp .finish

.wmcommand:
 mov eax,[wparam]
;нажата кнопка?
 cmp ax,IDC_BUTTON
 jne .finish
;получим в EAX число из редактора (flag - флаг корректности, последний параметр 1-знаковое число)
 invoke GetDlgItemInt,[hwnd],IDC_EDIT,flag,1
 cmp [flag],1
 je .numok
;нет числа
 stdcall PrintString,[hwnd],_error_num
;дадим фокус редактору
 invoke SetFocus,[hEdit]
 jmp .finish
.numok:
;сохраним в переменной
 mov [iVar],eax
;инкремент
 inc eax

;преобразуем в строку вида '1234 + 1 = 1235' !!!
 invoke wsprintf,_buf,_format,[iVar],eax
 stdcall PrintString,[hwnd],_buf
 invoke SetFocus,[hEdit]
 jmp .finish

;завершимся
.wmdestroy:
 invoke PostQuitMessage,0
.finish:
 xor eax,eax
.ret:
 ret
endp

proc PrintString uses esi,hwnd,string
local hDC:DWORD,Rct:RECT

;получим контекст окна
 invoke GetDC,[hwnd]
 mov [hDC], eax
;координаты участка, где будем писать
 mov [Rct.top],70
 mov [Rct.bottom],85
 mov [Rct.left],10
 mov [Rct.right],260

;сначала очистим фоном !!!
 invoke GetSysColorBrush,COLOR_BTNFACE
 lea esi,[Rct]
 invoke FillRect,[hDC],esi,eax

;чтобы текст выводился без изменения фона
 invoke SetBkMode,[hDC],TRANSPARENT
;цвет текста
 invoke SetTextColor,[hDC],00FF0000h   ; blue

;выведем в прямоугольнике Rct, esi*dr Rct
; -1 даст автоматическое вычисление длины строки
; одна строка, выравнивание: вертикаль - по центру, горизонталь - слева
 invoke DrawText,[hDC],[string],-1,esi,DT_SINGLELINE or DT_VCENTER or DT_LEFT

;освободим контекст
 invoke ReleaseDC,[hwnd],[hDC]
 ret
endp

section '.idata' import data readable writeable

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
gdi32,'GDI32.DLL'

include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\gdi32.inc'

Последний раз редактировалось rpy3uH; 18.01.2010 в 14:09.
Lamo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с кодом для ввода чисел с клавиатуры на FASM. Lamo Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.12.2009 20:45
ввод чисел на C# Alex_FF Помощь студентам 1 08.12.2009 16:40
Математические операции Juggernaut Общие вопросы Delphi 6 22.04.2009 10:34
Математические операции Pascal Gonzo Помощь студентам 5 19.03.2009 13:49
ввод чисел bruce Microsoft Office Excel 1 08.02.2007 17:58