flat assembler
Message board for the users of flat assembler.

Index > Windows > Mini calculator Dialog

Author
Thread Post new topic Reply to topic
frankobach26



Joined: 10 Apr 2026
Posts: 3
Location: Kassel
frankobach26 11 Apr 2026, 16:52
Hello all. Made my First example with fASM. I have got No result. Should Pop-up a.messagebox.. thanks for Help

Code:
; Mini Calculator - 3. korrigierte Version (April 2026)
format PE GUI 4.0
entry start

include 'win32a.inc'

; ------------------- Konstanten -------------------
ID_EDIT_A   = 1011
ID_EDIT_B   = 1012

ID_ADD      = 201
ID_SUB      = 202
ID_MUL      = 203
ID_DIV      = 204

; ------------------- Code -------------------
section '.text' code readable executable

start:
    invoke  GetModuleHandle, 0
    invoke  DialogBoxParam, eax, 37, HWND_DESKTOP, DialogProc, 0
    invoke  ExitProcess, 0


proc DialogProc hwnddlg, msg, wparam, lparam
    push    ebx esi edi

    cmp     [msg], WM_COMMAND
    je      .wmcommand

    cmp     [msg], WM_CLOSE
    je      .wmclose

    xor     eax, eax
    jmp     .finish

.wmcommand:
    ; ------------------- TEST: Bei jedem Button-Klick -------------------
    ; invoke  MessageBox, [hwnddlg], "Button geklickt!", "DEBUG", MB_OK   ; <- zum Testen einkommentieren

    ; Korrekte Auswertung (empfohlene Methode aus fASM-Beispielen)
    cmp     [wparam], BN_CLICKED shl 16 + IDCANCEL
    je      .wmclose

    cmp     [wparam], BN_CLICKED shl 16 + ID_ADD
    je      .do_add
    cmp     [wparam], BN_CLICKED shl 16 + ID_SUB
    je      .do_sub
    cmp     [wparam], BN_CLICKED shl 16 + ID_MUL
    je      .do_mul
    cmp     [wparam], BN_CLICKED shl 16 + ID_DIV
    je      .do_div
    cmp     [wparam], BN_CLICKED shl 16 + IDOK
    je      .do_add                     ; Calculate Button = Standard-Addition

    ; Alternative sichere Methode (falls oben nicht greift)
    mov     eax, [wparam]
    shr     eax, 16
    cmp     ax, BN_CLICKED
    jne     .processed

    movzx   eax, word [wparam]          ; Control-ID
    cmp     eax, ID_ADD
    je      .do_add
    cmp     eax, ID_SUB
    je      .do_sub
    cmp     eax, ID_MUL
    je      .do_mul
    cmp     eax, ID_DIV
    je      .do_div
    cmp     eax, IDOK
    je      .do_add

    jmp     .processed

; ------------------- Operationen -------------------
.do_add:
    mov     byte [op], '+'
    jmp     .calculate

.do_sub:
    mov     byte [op], '-'
    jmp     .calculate

.do_mul:
    mov     byte [op], '*'
    jmp     .calculate

.do_div:
    mov     byte [op], '/'
    jmp     .calculate

.calculate:
    call    .get_values

    cmp     byte [op], '+'
    je      .op_add
    cmp     byte [op], '-'
    je      .op_sub
    cmp     byte [op], '*'
    je      .op_mul
    cmp     byte [op], '/'
    je      .op_div
    jmp     .show_result

.op_add:
    mov     eax, [a]
    add     eax, [b]
    mov     [result], eax
    jmp     .show_result

.op_sub:
    mov     eax, [a]
    sub     eax, [b]
    mov     [result], eax
    jmp     .show_result

.op_mul:
    mov     eax, [a]
    imul    eax, [b]
    mov     [result], eax
    jmp     .show_result

.op_div:
    mov     eax, [b]
    test    eax, eax
    jz      .div_by_zero

    mov     eax, [a]
    cdq
    idiv    dword [b]
    mov     [result], eax
    jmp     .show_result

.div_by_zero:
    invoke  MessageBox, [hwnddlg], "Division durch Null nicht möglich!", "Fehler", MB_OK + MB_ICONERROR
    jmp     .processed

; ------------------- Hilfsprozeduren -------------------
.get_values:
    invoke  GetDlgItemText, [hwnddlg], ID_EDIT_A, caption, 64
    lea     esi, [caption]
    call    atoi
    mov     [a], eax

    invoke  GetDlgItemText, [hwnddlg], ID_EDIT_B, message, 64
    lea     esi, [message]
    call    atoi
    mov     [b], eax
    ret

.show_result:
    lea     edi, [outbuf]               ; immer neu starten!

    mov     eax, [a]
    call    itoa

    mov     byte [edi], ' '
    inc     edi
    mov     al, [op]
    mov     [edi], al
    inc     edi
    mov     byte [edi], ' '
    inc     edi

    mov     eax, [b]
    call    itoa

    mov     byte [edi], ' '
    inc     edi
    mov     byte [edi], '='
    inc     edi
    mov     byte [edi], ' '
    inc     edi

    mov     eax, [result]
    call    itoa

    mov     byte [edi], 0               ; Null-Terminator  extrem wichtig!

    invoke  MessageBox, [hwnddlg], outbuf, title, MB_OK
    jmp     .processed

.processed:
    mov     eax, 1
    jmp     .finish

.wmclose:
    invoke  EndDialog, [hwnddlg], 0

.finish:
    pop     edi esi ebx
    ret
endp


; ------------------- atoi -------------------
atoi:
    xor     eax, eax
.next:
    mov     bl, [esi]
    cmp     bl, 0
    je      .done
    cmp     bl, '0'
    jb      .done
    cmp     bl, '9'
    ja      .done
    sub     bl, '0'
    imul    eax, eax, 10
    add     eax, ebx
    inc     esi
    jmp     .next
.done:
    ret


; ------------------- itoa (mit Vorzeichen) -------------------
itoa:
    push    ebx ecx edx

    test    eax, eax
    jns     .positive
    mov     byte [edi], '-'
    inc     edi
    neg     eax

.positive:
    mov     ecx, 10
    xor     ebx, ebx

.convert:
    xor     edx, edx
    div     ecx
    add     dl, '0'
    push    dx
    inc     ebx
    test    eax, eax
    jnz     .convert

.write:
    pop     ax
    mov     [edi], al
    inc     edi
    dec     ebx
    jnz     .write

    pop     edx ecx ebx
    ret


; ------------------- Daten -------------------
section '.data' data readable writeable
    title   db 'Mini Calculator', 0

section '.bss' readable writeable
    a       dd ?
    b       dd ?
    result  dd ?
    op      db ?

    caption rb 64
    message rb 64
    outbuf  rb 128


; ------------------- Import -------------------
section '.idata' import data readable writeable

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

  import kernel32, \
         GetModuleHandle, 'GetModuleHandleA', \
         ExitProcess,     'ExitProcess'

  import user32, \
         DialogBoxParam,  'DialogBoxParamA', \
         GetDlgItemText,  'GetDlgItemTextA', \
         MessageBox,      'MessageBoxA', \
         EndDialog,       'EndDialog'


; ------------------- Dialog Resource -------------------
section '.rsrc' resource data readable

directory RT_DIALOG, dialogs

resource dialogs, \
    37, LANG_ENGLISH + SUBLANG_DEFAULT, democalc

dialog democalc, 'Mini Calculator', 70, 70, 240, 170, \
       WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME + DS_CENTER

    dialogitem 'STATIC', 'Zahl A:', -1, 10, 15, 80, 10, WS_VISIBLE
    dialogitem 'EDIT',   '', ID_EDIT_A, 10, 30, 200, 14, WS_VISIBLE + WS_BORDER + WS_TABSTOP + ES_NUMBER

    dialogitem 'STATIC', 'Zahl B:', -1, 10, 55, 80, 10, WS_VISIBLE
    dialogitem 'EDIT',   '', ID_EDIT_B, 10, 70, 200, 14, WS_VISIBLE + WS_BORDER + WS_TABSTOP + ES_NUMBER

    dialogitem 'BUTTON', '+', ID_ADD,  15, 100, 40, 20, WS_VISIBLE + WS_TABSTOP
    dialogitem 'BUTTON', '-', ID_SUB,  65, 100, 40, 20, WS_VISIBLE + WS_TABSTOP
    dialogitem 'BUTTON', '*', ID_MUL, 115, 100, 40, 20, WS_VISIBLE + WS_TABSTOP
    dialogitem 'BUTTON', '/', ID_DIV, 165, 100, 40, 20, WS_VISIBLE + WS_TABSTOP

    dialogitem 'BUTTON', 'Calculate', IDOK, 20, 135, 60, 20, \
               WS_VISIBLE + WS_TABSTOP + BS_DEFPUSHBUTTON

    dialogitem 'BUTTON', 'Schließen', IDCANCEL, 100, 135, 80, 20, WS_VISIBLE + WS_TABSTOP

enddialog    
Post 11 Apr 2026, 16:52
View user's profile Send private message Reply with quote
bitRAKE



Joined: 21 Jul 2003
Posts: 4428
Location: vpcmpistri
bitRAKE 12 Apr 2026, 03:28
Code:
atoi:
    xor     eax, eax
.next:
    mov     bl, [esi]
    cmp     bl, 0
    je      .done
    cmp     bl, '0'
    jb      .done
    cmp     bl, '9'
    ja      .done
    sub     bl, '0'
    imul    eax, eax, 10
    add     eax, ebx
    inc     esi
    jmp     .next
.done:
    ret    
Code adds "random" high bytes of EBX.

_________________
¯\(°_o)/¯ AI may [not] have aided with the above reply.
Post 12 Apr 2026, 03:28
View user's profile Send private message Visit poster's website Reply with quote
frankobach26



Joined: 10 Apr 2026
Posts: 3
Location: Kassel
frankobach26 14 Apr 2026, 17:46
Thanks bitrake. But I didnt need your Code for my calculator. Perhaps later. I have fixed my calculator Dialog cause in wm_command I Made a mistake. Heres my correct Version:

Code:
; 

; go dialog box, simple calculator, 14-04-2026, frankbach
; operators *,-,/,+ fixed ID_Calc to add
;
format PE GUI 4.0
entry start

include 'win32a.inc'

; IDs
ID_EDIT_A = 101
ID_EDIT_B = 102

ID_ADD = 201
ID_SUB = 202
ID_MUL = 203
ID_DIV = 204
ID_CALC = 205

section '.text' code readable executable

start:
    invoke GetModuleHandle, 0
    invoke DialogBoxParam, eax, 1, 0, DialogProc, 0
    invoke ExitProcess, 0


proc DialogProc hwnd, msg, wparam, lparam

    cmp [msg], WM_INITDIALOG
    je .init

    cmp [msg], WM_COMMAND
    je .wmcommand

    cmp [msg], WM_CLOSE
    je .close

    xor eax, eax
    ret

.init:
    mov byte [op], '+'
    mov eax, 1
    ret


.wmcommand:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    mov eax, [wparam]
    mov edx, eax
    and edx, 0FFFFh        ; ID
    shr eax, 16            ; Notification
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    cmp eax, BN_CLICKED
    jne .done

    cmp edx, ID_ADD
    je .set_add

    cmp edx, ID_SUB
    je .set_sub

    cmp edx, ID_MUL
    je .set_mul

    cmp edx, ID_DIV
    je .set_div

    cmp edx, ID_CALC
    je .calculate

    cmp edx, IDCANCEL
    je .close

    jmp .done


.set_add:
    mov byte [op], '+'
    jmp .done

.set_sub:
    mov byte [op], '-'
    jmp .done

.set_mul:
    mov byte [op], '*'
    jmp .done

.set_div:
    mov byte [op], '/'
    jmp .done


.calculate:

    ; --- A lesen ---
    invoke GetDlgItemText, [hwnd], ID_EDIT_A, bufA, 32
    lea esi, [bufA]
    call atoi
    mov [a], eax

    ; --- B lesen ---
    invoke GetDlgItemText, [hwnd], ID_EDIT_B, bufB, 32
    lea esi, [bufB]
    call atoi
    mov [b], eax

    ; --- rechnen ---
    mov eax, [a]

    cmp byte [op], '+'
    je .add

    cmp byte [op], '-'
    je .sub

    cmp byte [op], '*'
    je .mul

    cmp byte [op], '/'
    je .div

.add:
    add eax, [b]
    jmp .store

.sub:
    sub eax, [b]
    jmp .store

.mul:
    imul eax, [b]
    jmp .store

.div:
    cmp dword [b], 0
    je .divzero
    cdq
    idiv dword [b]
    jmp .store

.divzero:
    invoke MessageBox, [hwnd], "Division durch 0!", "Fehler", MB_OK
    jmp .done

.store:
    mov [res], eax

    ; --- Ausgabe ---
    lea edi, [outbuf]

    mov eax, [res]
    call itoa

    mov byte [edi], 0

    invoke MessageBox, [hwnd], outbuf, "Ergebnis", MB_OK

    jmp .done


.close:
    invoke EndDialog, [hwnd], 0

.done:
    mov eax, 1
    ret

endp


; ---------------- atoi ----------------
;atoi:
;    xor eax, eax
;.next:
;    mov bl, [esi]
;    cmp bl, 0
;    je .done
;    sub bl, '0'
;    imul eax, eax, 10
;    add eax, ebx
;    inc esi
;    jmp .next
;.done:
;    ret

atoi:
    xor     eax, eax
.next:
    mov     bl, [esi]
    cmp     bl, 0
    je      .done
    cmp     bl, '0'
    jb      .done
    cmp     bl, '9'
    ja      .done
    sub     bl, '0'
    imul    eax, eax, 10
    add     eax, ebx
    inc     esi
    jmp     .next
.done:
    ret
    ; Code adds "random" high bytes of EBX.


; ---------------- itoa ----------------
itoa:
    push ebx ecx edx

    mov ecx, 10
    xor ebx, ebx

.convert:
    xor edx, edx
    div ecx
    add dl, '0'
    push dx
    inc ebx
    test eax, eax
    jnz .convert

.write:
    pop ax
    mov [edi], al
    inc edi
    dec ebx
    jnz .write

    pop edx ecx ebx
    ret


section '.data' data readable writeable
    a dd 0
    b dd 0
    res dd 0
    op db '+'

section '.bss' readable writeable
    bufA rb 32
    bufB rb 32
    outbuf rb 64


section '.idata' import data readable writeable

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

import kernel32,\
       GetModuleHandle,'GetModuleHandleA',\
       ExitProcess,'ExitProcess'

import user32,\
       DialogBoxParam,'DialogBoxParamA',\
       GetDlgItemText,'GetDlgItemTextA',\
       MessageBox,'MessageBoxA',\
       EndDialog,'EndDialog'


section '.rsrc' resource data readable

directory RT_DIALOG, dialogs

resource dialogs,\
    1, LANG_NEUTRAL, demo

dialog demo, 'Mini Calculator', 100,100,220,160,\
       WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME

    dialogitem 'EDIT','',ID_EDIT_A,20,20,160,14,WS_VISIBLE+WS_BORDER
    dialogitem 'EDIT','',ID_EDIT_B,20,45,160,14,WS_VISIBLE+WS_BORDER

    dialogitem 'BUTTON','+',ID_ADD,20,70,40,20,WS_VISIBLE
    dialogitem 'BUTTON','-',ID_SUB,65,70,40,20,WS_VISIBLE
    dialogitem 'BUTTON','*',ID_MUL,110,70,40,20,WS_VISIBLE
    dialogitem 'BUTTON','/',ID_DIV,155,70,40,20,WS_VISIBLE

    dialogitem 'BUTTON','Calculate',ID_CALC,40,105,60,20,WS_VISIBLE
    dialogitem 'BUTTON','Exit',IDCANCEL,120,105,60,20,WS_VISIBLE

enddialog
 ; ends    
Post 14 Apr 2026, 17:46
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2026, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.