⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ewcalc.asm

📁 -Win32 Assembly写的小程式,含 Source Code! -工程计算机,可达112 bits !
💻 ASM
📖 第 1 页 / 共 5 页
字号:
               add     Key, 200
               jmp     pass
         .endif
         .if wparam > 5fh && wparam < 6ah
             MOVmd     Key, wparam
               sub     Key, 96
               add     Key, 200
               jmp     pass
         .endif
         .if wparam > 40h && wparam < 47h
             MOVmd     Key, wparam
               sub     Key, 55
               add     Key, 200
               jmp     pass
         .endif
         .if wparam == 6eh || wparam == 0beh
               mov     Key, 216    ; .
         .elseif wparam == 6bh ;|| wparam == 0bbh
               mov     Key, 218    ; +
         .elseif wparam == 6dh || wparam == 0bdh
               mov     Key, 219    ; -
         .elseif wparam == 6ah || wparam == 0bah
               mov     Key, 220    ; *
         .elseif wparam == 6fh || wparam == 0bfh
               mov     Key, 221    ; /
         .elseif wparam == 0dh || wparam == 0bbh
               mov     Key, 222    ; =
         .else
         .endif
      .endif

pass:
      INVOKE        CallWindowProc, SubEdit, hwnd, wmsg, wparam, lparam
      .if wmsg == WM_CUT
           call     ClearValues
      .endif
      .if Key > 0
           call     ToolbarProc
      .endif
           RET
EditProc   ENDP

;=========================================================================|
;                       Processes calculator input.                       |
;=========================================================================|
ToolbarProc   PROC  uses ebx ecx edx esi edi  hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD

      .if wmsg == WM_COMMAND || Key > 0
         INVOKE     SendMessage, hOpr, WM_SETTEXT, NULL, ADDR Clear
         .if Key > 0
             MOVmd     wparam, Key
               mov     Key, 0
            INVOKE     SetFocus, hWnd
         .endif
         INVOKE     SendMessage, hEdit, WM_GETTEXT, 35, offset ConvO
         INVOKE     SendMessage, hEdit, WM_GETTEXT, 35, offset Buff
         .if Buff == '*'
               jmp     GetOut
         .endif
            mov     eax, wparam
            mov     N, 0

         .if eax == 288
               mov     ConvI, 0
            INVOKE     lstrlen, addr Buff
               mov     esi, eax
               xor     edi, edi
               mov     eax, '0'
               mov     ecx, '0'
               mov     edx, '0'
            .if Base == 10 || Base == 16
                  mov     ebx, '9'
               .if Base == 16
                     mov     ecx, 'A'
                     mov     edx, 'F'
               .endif
            .elseif Base == 2
                  mov     ebx, '1'
            .elseif Base == 8
                  mov     ebx, '7'
            .endif
            .while (esi)
               .if byte ptr Buff[edi] > 90
                     sub     byte ptr Buff[edi], 32
                     sub     byte ptr ConvO[edi], 32
               .endif
               .if byte ptr Buff[edi] >= al && byte ptr Buff[edi] <= bl\
                || byte ptr Buff[edi] >= cl && byte ptr Buff[edi] <= dl
               .else
                    call     ClearValues
                  INVOKE     MessageBox, NULL, addr szPaste, addr AppName, MB_OK or MB_ICONWARNING or MB_TASKMODAL
                     jmp     GetOut
               .endif
                  inc     edi
                  dec     esi
            .endw
               jmp     DecP
         .endif

         .if Base == 10 || Base == 8  ; Dec or Oct
               or      N, 1
         .endif  
         .if ((eax > 199 && eax < 210 && N == 1 || eax > 199 && eax < 216 && Base == 16)\
           || (eax > 199 && eax < 202 && Base == 2 || eax == 216))
               mov     eax, wparam
               sub     eax, 200
            .if eax == 16
               .if DP == 0  
                  mov     ConvI, '.'
                  mov     ConvI+1, 0
               .else
                  mov     ConvI, 0
               .endif
                  jmp     DecP
            .endif
               lea     ebx, offset FmtA
            .if Base ==16
                  lea     ebx, offset FmtH
            .endif
            INVOKE     wsprintf, ADDR ConvI, ebx, eax

DecP:
            .if ConvO == '0' && ConvO + 1 == 0
                  mov     ConvO, 0
            .endif
            INVOKE     lstrcat, offset ConvO, offset ConvI
            INVOKE     SendMessage, hEdit, WM_SETTEXT, NULL, offset ConvO
            INVOKE     lstrlen, ADDR ConvO
               mov     ebx, 34
            .if Base == 16
                  mov     ebx, 28
            .endif       
            .if eax > ebx
               INVOKE     MessageBeep, MB_OK
                  mov     ConvO[ebx], 0
               INVOKE     SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
            .endif
            .if eax > 16 && BPress == 3
               INVOKE     MessageBeep, MB_OK
                  mov     ConvO + 16, 0
               INVOKE     SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
            .endif
            .if eax > 19 && BPress == 4 || eax > 19 && Float == 1
               INVOKE     MessageBeep, MB_OK
                  mov     ConvO + 19, 0
               INVOKE     SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
            .endif
            INVOKE     SendMessage, hEdit, EM_SETSEL, 34, 34
            INVOKE     lstrcpyn, ADDR Buff, ADDR ConvO, 34
              call     AsciiToBase
            INVOKE     lstrcpyn, ADDR Buff, ADDR ConvO, 34
              call     AsciiToFloat
               mov     edx, offset RNum10
              call     FloatToAscii
              call     Display
               mov     eax, wparam
         .endif

;--------[ Memory clear ]-------------------------------------------------
         .if eax == IDB_BUTMC
              fldz
              fstp     RMem10
            INVOKE     CLRMW, offset MEM, 12
            INVOKE     SendMessage, hMem, WM_SETTEXT, NULL, ADDR Clear
         .endif
  
;--------[ Memory recall ]------------------------------------------------
         .if eax == IDB_BUTMR
            .if BPress == 0
                  fld     RMem10
                 fstp     RNum10
                  fld     RMem10
                 fstp     RWrk10
            .else
                  fld     RNum10
                 fstp     RWrk10
                  fld     RMem10
                 fstp     RNum10
            .endif
               mov     edx, offset RNum10

              call     FloatToAscii
            INVOKE     CopyMW, offset R, offset MEM, 12
              call     BaseToAscii
            INVOKE     SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
            INVOKE     SendMessage, hEdit, EM_SETSEL, 33, 33
              call     Display
         .endif
  
;--------[ Memory store ]-------------------------------------------------
         .if eax == IDB_BUTMS
               fld     RNum10
              fstp     RMem10
            INVOKE     CopyMW, offset MEM, offset R, 12
            INVOKE     SendMessage, hMem, WM_SETTEXT, NULL, ADDR M
              call     StoreCLR
         .endif
  
;--------[ Memory add ]---------------------------------------------------
         .if eax == IDB_BUTMP
               fld     RNum10
               fld     RMem10
              fadd     ST(0), ST(1)
              fstp     RMem10
               mov     edx, offset RMem10
              call     FloatToAscii

            INVOKE     CopyMW, offset PT, offset MEM, 12
               mov     BPress, 1
              call     Prep
              call     AddEM
               mov     BPress, 0
            INVOKE     CopyMW, offset MEM, offset R, 12
            INVOKE     SendMessage, hMem, WM_SETTEXT, NULL, ADDR M
              call     StoreCLR
         .endif
  
;--------[ Memory subtract ]----------------------------------------------
         .if eax == IDB_BUTMM
               fld     RNum10
               fld     RMem10
              fsub     ST(0), ST(1)
              fstp     RMem10
               mov     edx, offset RMem10
              call     FloatToAscii
 
            INVOKE     CopyMW, offset PT, offset MEM, 12
               mov     BPress, 2   
              call     Prep
              call     SubEM
               and     BPress, 0
            INVOKE     CopyMW, offset MEM, offset R, 12
            INVOKE     SendMessage, hMem, WM_SETTEXT, NULL, ADDR M
              call     StoreCLR
         .endif

;--------[ Load pi ]------------------------------------------------------
         .if eax == IDB_BUTPI
             fldpi
              fstp     RNum10
               mov     edx, offset RNum10
              call     FloatToAscii 
            INVOKE     SendMessage, hEdit, WM_SETTEXT, NULL, ADDR Pi
            INVOKE     SendMessage, hEdit, EM_SETSEL, 33, 33
            INVOKE     lstrcpy, ADDR Buff, ADDR Pi
              call     AsciiToBase
              call     Display
         .endif

;--------[ Trig functions ]-----------------------------------------------
         .if eax == IDB_BUTSIN || eax == IDB_BUTCOS || eax == IDB_BUTTAN ||\
             eax == IDB_BUTSEC || eax == IDB_BUTCSC || eax == IDB_BUTCOT
             finit
               fld     RNum10
            .if T == 1
                  fld     RDeg10
                 fmul     ST(0), ST(1)
               .if eax == IDB_BUTTAN && ArcOn == 1
                     fld     RNum10
               .endif
            .endif   
            .if eax == IDB_BUTSIN
               .if ArcOn == 0
                     fsin
               .else
                     fld     st(0)       ; Duplicate X on tos.
                    fmul                 ; Compute X**2.
                     fld     st(0)       ; Duplicate X**2 on tos.
                    fld1                 ; Compute 1-X**2.
                   fsubr
                    fdiv                 ; Compute X**2/(1-X**2).
                   fsqrt                 ; Compute sqrt(x**2/(1-X**2)).
                    fld1                 ; To compute full arctangent.
                  fpatan                 ; Compute atan of the above.
               .endif
            .elseif eax == IDB_BUTCOS
               .if ArcOn == 0
                    fcos
               .else
                     fld     st(0)       ; Duplicate X on tos.
                    fmul                 ; Compute X**2.
                     fld     st(0)       ; Duplicate X**2 on tos.
                    fld1                 ; Compute 1-X**2.
                   fsubr
                   fdivr                 ; Compute (1-x**2)/X**2.
                   fsqrt                 ; Compute sqrt((1-X**2)/X**2).
                    fld1                 ; To compute full arctangent.
                  fpatan                 ; Compute atan of the above.
               .endif
            .elseif eax == IDB_BUTTAN && ArcOn == 0
                fptan
                 fmul     ST(0), ST(1)
            .elseif eax == IDB_BUTTAN && ArcOn == 1
                 fld1                    ; To compute full arctangent.
               fpatan                    ; Compute atan of the above.
               .if T == 1
                     fld     RRad10
                    fmul     ST(0), ST(1)
               .endif
            .elseif eax == IDB_BUTSEC
               .if ArcOn == 0
                    fcos
                    fld1
                   fdivr
               .else
                     fld     st(0)       ; Duplicate
                    fmul                 ; Compute x*x
                    fld1                 ; Load 1
                    fsub                 ; Compute x*x-1
                   fsqrt                 ; Compute sqrt(x*x-1)
                    fld1                 ; Load 1
                  fpatan                 ; Compute atan of above.
               .endif 
            .elseif eax == IDB_BUTCSC
               .if ArcOn == 0
                    fsin
                    fld1
                   fdivr
               .else
                     fld     st(0)       ; Duplicate
                    fmul                 ; Compute x*x
                    fld1                 ; Load 1
                    fsub                 ; Compute x*x-1
                    fld1                 ; Load 1
                   fdivr                 ; Compute 1/(x*x-1)
                   fsqrt                 ; Compute sqrt(1/(x*x-1))
                    fld1                 ; Load 1
                  fpatan                 ; Compute atan of above.
               .endif  
            .elseif eax == IDB_BUTCOT
               .if ArcOn == 0
                 fsincos
                   fdivr
               .else
                    fld1                 ; fpatan computes
                    fxch                 ; atan(st(1)/st(0)).
                  fpatan                 ; atan(st(0)/st(1)).
               .endif
            .endif
              fstp     RNum10
            .if ArcOn == 0 || ArcOn == 1 && eax == IDB_BUTTAN
                  or      NoFix, 1
            .endif
               mov     edx,offset RNum10
              call     FloatToAscii
               and     NoFix, 0
               jmp     FromSQ
         .endif

;--------[ Log 10 function ]----------------------------------------------
         .if eax == IDB_BUTLOG && Buff != 0
             finit
              call     AsciiToFloat
               fld     RNum10
              fld1
              fxch
             fyl2x                         ; st(1) * log2(st(0)) 'alpha l not num 1'
            fldl2t
              fdiv
              fstp     RNum10
               mov     edx,offset RNum10
              call     FloatToAscii
               jmp     FromSQ
         .endif

;--------[ Exponent functions ]-------------------------------------------
         .if eax == IDB_BUT2X || eax == IDB_BUT10X || eax == IDB_BUTEX && Buff != 0
             finit
              call     AsciiToFloat
               fld     RNum10
            .if eax == IDB_BUT2X
                  call     TwoX
            .elseif eax == IDB_BUT10X
                  call     TenX
            .elseif eax == IDB_BUTEX
                  call     ExpX
            .endif
               mov     edx,offset RNum10
              call     FloatToAscii
               jmp     FromSQ

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -