News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Suggestion with MSVCRT code.

Started by hutch--, June 06, 2005, 04:59:13 AM

Previous topic - Next topic

GregL

Concatenate multiple strings using strcat C Run-Time function.


.586
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE

include    msvcrt.inc
includelib msvcrt.lib

.CODE

strmulticat PROC C argcount:DWORD, pDest:PTR BYTE, pArgs:VARARG
    ; concatenates multiple strings
    ; uses strcat C Run-Time function
    xor eax, eax
    .WHILE argcount > 0
        push eax
        mov edx, pArgs[eax]
        invoke crt_strcat, pDest, edx
        pop eax
        dec argcount
        add eax, 4
    .ENDW
    mov eax, pDest
    ret
strmulticat ENDP

END   


hutch--

Greg,

Sorry to be a bit slow coming back. I just tested the sscanf mcros and they work fine in your test piece.  :U
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

MichaelW

This is a test piece that I used to determine how to read the _HUGE value from MSVCRT.DLL, and verify exactly what the value is. The _HUGE value is returned in case of error by a number of the floating-point support routines. The macro is supposed to automate the testing of the return value. I avoided using the FPU to do the comparison because doing so (without complex code) would destroy the return value that the function left on the FPU stack. The code clears the sign bit because some of the functions return +/- HUGE_VAL, where the sign of HUGE_VAL matches the sign of the value that cannot be represented.

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc

    dbl2bin PROTO :REAL8,:DWORD

    is_huge_val MACRO dbl
        push  edx
        mov   eax, _imp___HUGE
        mov   eax, [eax]
        cmp   eax, DWORD PTR dbl
        mov   eax, 0
        jne   @F
        mov   eax, _imp___HUGE
        mov   eax, [eax+4]
        mov   edx, DWORD PTR dbl+4
        and   edx, NOT 80000000h        ;; clear sign bit
        cmp   eax, edx
        mov   eax, 0
        jne   @F
        mov   eax, 1
      @@:
        pop   edx
        EXITM <eax>
    ENDM

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
      HUGE_VAL  REAL8 0.0
      binstr    db 65 dup(0)
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    mov   ebx,_imp___HUGE
    fld   REAL8 PTR [ebx]
    fstp  HUGE_VAL

    invoke crt_printf, chr$("%E",10,"%f",10), HUGE_VAL, HUGE_VAL

    invoke dbl2bin, HUGE_VAL, ADDR binstr
    print ADDR binstr,13,10
    print "seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffff"
    print chr$(13,10)
    print ustr$(is_huge_val(HUGE_VAL)),13,10
    print ustr$(is_huge_val(HUGE_VAL+1)),13,10
   
    mov   eax, input(13,10,13,10,"Press enter to exit...")
    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

dbl2bin proc uses edi dbl:REAL8, ptrsz:DWORD
    mov   eax, DWORD PTR dbl+4
    mov   edi, ptrsz
    sub   edi, 1
    mov   ecx, 32
  @@:
    add   edi, 1
    xor   edx, edx
    shl   eax, 1                ; next bit -> carry flag
    adc   edx, '0'
    mov   [edi], dl
    sub   ecx, 1
    jnz   @B
    mov   eax, DWORD PTR dbl
    mov   ecx, 32
  @@:
    add   edi, 1
    xor   edx, edx
    shl   eax, 1                ; next bit -> carry flag
    adc   edx, '0'
    mov   [edi], dl
    sub   ecx, 1
    jnz   @B
    mov   BYTE PTR [ebx+1], 0   ; terminating null
    ret
dbl2bin endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start



eschew obfuscation

ollydbg

Needn't so many macros. Make it easier like this:

printf   PROTO   C :dword,:vararg
includelib msvcrt.lib
.data
fmt db "%s",0
str db "run",10,0
.code
start:
      invoke printf,offset fmt,offset str
      invoke ExitProcess,0
end start