News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

Adding two numbers with MASM32 ?

Started by sunshine33, August 03, 2018, 08:01:30 AM

Previous topic - Next topic

NoCforMe

So now do it where you get those numbers from the user (via text input). How would you do that?
32-bit code and Windows 7 foreva!

hutch--

I guess that the only problem with code of this type,

printf  ("\nResult: %u\n", eax)

is you pull in the C runtime library and unless you are calling MSVCRT, your app just got a lot bigger.

daydreamer

alternative to read in string->convert to dword ->add ->convert to ascii
is perform a BCD add
http://www.ray.masmcode.com/BCDtut.html
my none asm creations
https://masm32.com/board/index.php?topic=6937.msg74303#msg74303
I am an Invoker
"An Invoker is a mage who specializes in the manipulation of raw and elemental energies."
Like SIMD coding

jj2007

Quote from: hutch-- on July 27, 2022, 07:31:43 PM
I guess that the only problem with code of this type,

printf  ("\nResult: %u\n", eax)

is you pull in the C runtime library and unless you are calling MSVCRT, your app just got a lot bigger.

include \masm32\include\masm32rt.inc

.code
start:
  mov eax, 12345
  invoke crt_printf, chr$("eax=%i"), eax
  exit
end start


1024 bytes. What do you mean with "pull in the C runtime library"?

hutch--

 :biggrin:

> unless you are calling MSVCRT, your app just got a lot bigger.

C runtime library is used by C, a static library.  :biggrin:

TimoVJL

Quote from: hutch-- on July 27, 2022, 09:20:12 PM
:biggrin:

> unless you are calling MSVCRT, your app just got a lot bigger.

C runtime library is used by C, a static library.  :biggrin:
masm32/64 have own static runtime library.
C don't always need crt and can work with bare win32 API and use Windows OS msvcrt.dll directly.
May the source be with you

NoCforMe

Quote from: jj2007 on July 27, 2022, 09:10:12 PM
include \masm32\include\masm32rt.inc

.code
start:
  mov eax, 12345
  invoke crt_printf, chr$("eax=%i"), eax
  exit
end start


1024 bytes. What do you mean with "pull in the C runtime library"?

Doesn't the "crt" in crt_printf() mean "C runtime"? (I know it's part of the MASM32 library.)
32-bit code and Windows 7 foreva!

hutch--

Timo is right, C can use either its native runtime, static libraries or it can call MSVCRT but when I see "printf" in masm code, I reasonably assume that its the C runtime, not the system DLL.

NoCforMe

I've always used wsprintf(), which is a Win32 function.
32-bit code and Windows 7 foreva!

daydreamer

Quote from: NoCforMe on July 28, 2022, 10:32:23 AM
I've always used wsprintf(), which is a Win32 function.
I always use masm32 "print" macro until recently I converted to GUI app with Catstr$ macro followed by invoke SendMessageA and/or invoke MessageBox...
very useful when simulating lots of prints to a big text GUI control


my none asm creations
https://masm32.com/board/index.php?topic=6937.msg74303#msg74303
I am an Invoker
"An Invoker is a mage who specializes in the manipulation of raw and elemental energies."
Like SIMD coding

NoCforMe

wsprintf()/MessageBox() are very useful for inline debugging.

Can't tell you how many times I've done something like this:


.data

BuffPtrFmt DB "The buffer pointer is %08X", 0

.code

Something PROC
LOCAL buffPtr:DWORD, buffer[256]:BYTE

... do some stuff w/pointer ...

... now we want to see where the pointer is pointing:

INVOKE wsprintf, ADDR buffer, OFFSET BuffPtrFmt, buffPtr
INVOKE MessageBox, NULL, ADDR buffer, NULL, MB_OK


I've got all that stuff memorized ...
32-bit code and Windows 7 foreva!

jj2007

Quote from: NoCforMe on July 29, 2022, 09:12:35 AM
wsprintf()/MessageBox() are very useful for inline debugging.

Can't tell you how many times I've done something like this:

I can tell you how often I use deb :tongue:

deeR44

#72
See this file in a later post as a 'zip' file.

hutch--

Just do it !  :biggrin:

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

    include \masm64\include64\masm64rt.inc

    .code

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

entry_point proc

    LOCAL pbuf1  :QWORD
    LOCAL buff1[128]:BYTE
    LOCAL pbuf2  :QWORD
    LOCAL buff2[128]:BYTE
    LOCAL var1  :QWORD
    LOCAL var2  :QWORD

    mov pbuf1, ptr$(buff1)
    mov pbuf2, ptr$(buff2)

    conout "Enter an integer "
    rcall StdIn,pbuf1,128

    conout "Enter an integer "
    rcall StdIn,pbuf2,128

    mov var1, uval(pbuf1)
    mov var2, uval(pbuf2)

    mov rax, var2
    add var1, rax

    conout "The total of both integers = ",str$(var1),lf

    waitkey
    .exit

entry_point endp

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

    end

hutch--

Floating point version.  :biggrin:

; «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»

    include \masm64\include64\masm64rt.inc

    .code

; «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»

entry_point proc

    LOCAL pbuf1  :QWORD
    LOCAL buff1[128]:BYTE
    LOCAL pbuf2  :QWORD
    LOCAL buff2[128]:BYTE
    LOCAL var1  :REAL8
    LOCAL var2  :REAL8
    LOCAL rslt  :REAL8

    mov pbuf1, ptr$(buff1)                          ; get the pointer to the buffer
    mov pbuf2, ptr$(buff2)                          ; get the pointer to the buffer

    conout "Enter a floating point number "
    rcall StdIn,pbuf1,128                           ; get a floating point format string

    conout "Enter a floating point number "
    rcall StdIn,pbuf2,128                           ; get a floating point format string

    rcall atofp,pbuf1,ptr$(var1)                    ; convert string data to floating point
    rcall atofp,pbuf2,ptr$(var2)                    ; convert string data to floating point

    movsd xmm0, var1                                ; load fp var into xmm0
    movsd xmm1, var2                                ; load fp var into xmm1
    addsd xmm0, xmm1                                ; add the two together
    movsd rslt, xmm0                                ; copy result into fp var

    rcall fptoa,rslt,pbuf1                          ; reuse pbuf1

    conout "Floating point result = ",pbuf1,lf      ; display total

    waitkey
    .exit

entry_point endp

; «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»

    end