News:

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

Main Menu

same thread proc for many threads?

Started by daydreamer, February 21, 2021, 12:47:43 AM

Previous topic - Next topic

TouEnMasm

#15
A good thing,,keep esp in a variable at the start of code.
at the end of code,verify that his value had not changed.
Normally,a compiler create the epilogue and had itself the ret16.

Fa is a musical note to play with CL

daydreamer

Quote from: TouEnMasm on March 06, 2021, 04:44:15 AM
A good thing,,keep esp in a variable at the start of code.
at the end of code,verify that his value had not changed.
Normally,a compiler create the epilogue and had itself the ret16.
good to know max stack size used,saved esp can instead be used temporary pointing to LOCAL array you could do stack tricks,before restore it
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

six_L

Hi, daydreamer
although you providid the source codes, but i don't understand which key is your question. in accordance with " use print loc x,y together with print inside threads doesnt work,it text appears similar randomness that output from 4 threads does", i only guessed and trying to give a bit of useful information. the TLS that TouEnMasm has been mentioned maybe handle this flaw.

testdll_2.dll
option casemap:none
option win64:7
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \UASM64\include\windows.inc

includelib \UASM64\Lib\user32.lib
includelib \UASM64\Lib\kernel32.lib
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
return  MACRO arg
        mov rax, arg
        ret
ENDM
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.DATA?
        hInstance dq ?
dwTlsIndex dd ? ;// address of shared memory
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.CODE
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DllEntry proc hinstDLL:HINSTANCE, fdwReason:QWORD, lpvReserved:QWORD
LOCAL lpvData:LPVOID
         
;// The DLL is loading due to process
        ;// initialization or a call to LoadLibrary.
   
.if fdwReason == DLL_PROCESS_ATTACH
mov rax, hinstDLL
mov hInstance,rax
;// Allocate a TLS index.
invoke TlsAlloc
mov dwTlsIndex,eax
.if dwTlsIndex == TLS_OUT_OF_INDEXES
return FALSE
.endif
return TRUE
;// No break: Initialize the index for first thread.
;// The attached process creates a new thread.

.elseif fdwReason == DLL_PROCESS_DETACH
;// DLL unload due to process termination or FreeLibrary.
;// Release the allocated memory for this thread.
invoke TlsGetValue,dwTlsIndex
mov lpvData,rax
.if lpvData != 0
invoke GlobalFree,lpvData
.endif
;// Release the TLS index.
invoke TlsFree,dwTlsIndex
return TRUE
.elseif fdwReason == DLL_THREAD_ATTACH
;// Initialize the TLS index for this thread.
invoke GlobalAlloc,LPTR,256
mov lpvData,rax
.if lpvData != NULL
invoke TlsSetValue,dwTlsIndex,lpvData
.if rax == NULL
return FALSE
.endif
.endif
return TRUE
.elseif fdwReason == DLL_THREAD_DETACH
;// The thread of the attached process terminates.
;// Release the allocated memory for this thread.
invoke TlsGetValue,dwTlsIndex
mov lpvData,rax
.if lpvData != 0
invoke GlobalFree,lpvData
.endif
return TRUE
.endif
return FALSE

DllEntry Endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
_StoreData PROC _dq:QWORD
LOCAL lpvData:LPVOID ; the OS TLS stored data pointer
LOCAL pData:QWORD ; The stored data pointer
LOCAL _Data:QWORD ; The data

invoke TlsGetValue,dwTlsIndex
mov lpvData,rax
.if lpvData == 0
invoke GlobalAlloc,LPTR,256
mov lpvData,rax
.if lpvData == NULL
return FALSE
.endif
invoke TlsSetValue,dwTlsIndex,lpvData
.if rax == NULL
return FALSE
.endif
.endif
;// Cast to my data type.
;// In this example, it is only a pointer to a QWORD
;// but it can be a structure pointer to contain more complicated data.
;pData = (QWORD *) lpvData
;(*pData) = dq;
mov rax,_dq
mov _Data,rax
lea rax,_Data
mov pData,rax
mov rax,lpvData
mov rcx,pData
mov [rax],rcx
return TRUE

_StoreData ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
_GetData PROC _pdq:QWORD
LOCAL lpvData:LPVOID
LOCAL pData:QWORD ;The stored memory pointer

invoke TlsGetValue,dwTlsIndex
mov lpvData,rax
.if lpvData == 0
return FALSE
.endif
;   pData = (QWORD *) lpvData;
;   (*pdq) = (*pData);
mov rax,lpvData
mov rcx,[rax]
mov pData,rcx
mov rax,pData
mov rcx,[rax]
mov rax,_pdq
mov [rax],rcx ; data write into the address from outside.
return TRUE

_GetData ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

End DllEntry


TlsTest_2.exe
option casemap:none
option win64:7
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \UASM64\include\windows.inc

includelib \UASM64\Lib\user32.lib
includelib \UASM64\Lib\kernel32.lib
includelib \UASM64\Lib\gdi32.lib
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include testdll_2.inc
includelib testdll_2.lib
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
MYTHREADTLSDATA struct
m_ID dd ?
m_Name db 12 dup(?)
m_xx dd ?
m_yy dd ?
m_Coror dd ?
MYTHREADTLSDATA ends
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
return  MACRO arg
        mov rax, arg
        ret
ENDM
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
ICO_MAIN equ 1000
DLG_MAIN equ 100
IDC_STAR equ 101
IDC_EXIT equ 102
IDC_OUTPUT equ 103

THREADCOUNT equ 4
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.data?
hInstance dq ?
hOutwnd dq ?
winClientW dd ?
winClientH dd ?
hFont dq ?
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.data
hThreadBuf QWORD THREADCOUNT dup (0)
ThreadIndex QWORD 0
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.code
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
ErrorMessage Proc USES RBX lpCaption:qword
Local lpErrorMessage:QWORD

call GetLastError
lea rbx,lpErrorMessage
invoke FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, LANG_NEUTRAL,rbx,0,NULL

invoke MessageBox, 0, lpErrorMessage, lpCaption, MB_OK
invoke LocalFree, lpErrorMessage
ret   

ErrorMessage EndP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
iRandom_A proc _dqMin:QWORD, _dqMax:QWORD

mov rax, 100                ; out of range number
rdtsc                           ; date time counter
pause                           ; spinlock pause
bswap rax                     ; reverse byte order
mov r11, rax                ; store rax in r11

mov rcx, 10                 ; loop count
@@:
rdtsc                           ; date time counter
pause                           ; spinlock pause
bswap rax                     ; reverse byte order
rol rax, 11                 ; rotate left by prime
xor r11, rax                ; xor rax to r11
rol r11, 7                  ; rotate left by prime
sub rcx, 1                  ; decrement counter

jnz @B
mov rax, r11                ; seed the value in r11

mov rcx, _dqMax
sub rcx, _dqMin
inc rcx
xor rdx, rdx
div rcx
mov rax, rdx
add rax,_dqMin ; rax = Rand_Number [ _dqMin, _dqMax ]

ret

iRandom_A endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
ThreadFunc PROC USES RBX _VOID:QWORD
LOCAL dqOut:QWORD
LOCAL szBuf[64]:BYTE
LOCAL thePrivateData:MYTHREADTLSDATA
LOCAL hdc:HDC

inc ThreadIndex
invoke RtlZeroMemory,ADDR thePrivateData,sizeof MYTHREADTLSDATA

;here, save the datas of thread private
lea rbx,thePrivateData

invoke GetCurrentThreadId
mov (MYTHREADTLSDATA PTR [rbx]).m_ID,eax

invoke RtlZeroMemory,ADDR szBuf,sizeof szBuf
invoke wsprintf,ADDR szBuf, CStr("position_%d"),ThreadIndex
invoke lstrcat,ADDR (MYTHREADTLSDATA PTR [rbx]).m_Name, ADDR szBuf

invoke iRandom_A, 0, winClientW
mov (MYTHREADTLSDATA PTR [rbx]).m_xx,eax
invoke iRandom_A, 0, winClientH
mov (MYTHREADTLSDATA PTR [rbx]).m_yy,eax

.if ThreadIndex == 1
mov (MYTHREADTLSDATA PTR [rbx]).m_Coror,0FF0000H
.elseif ThreadIndex == 2
mov (MYTHREADTLSDATA PTR [rbx]).m_Coror,000FF00H
.elseif ThreadIndex == 3
mov (MYTHREADTLSDATA PTR [rbx]).m_Coror,00000FFH
.elseif ThreadIndex == 4
mov (MYTHREADTLSDATA PTR [rbx]).m_Coror,0FFFF00H
.endif

invoke _StoreData,rbx
.if rax == NULL
invoke ErrorMessage,CStr("StoreData error")
return FALSE
.endif
;----------------------------------------------------------------------------------
;here, use the datas of thread private
invoke _GetData, addr dqOut
.if rax == FALSE
invoke ErrorMessage,CStr("GetData error")
return FALSE
.endif

invoke RtlZeroMemory,addr szBuf,sizeof szBuf
mov rbx,dqOut
invoke wsprintf,ADDR szBuf, CStr("ThreadId-%d: [ %s (%d, %d) ]"),(MYTHREADTLSDATA PTR [rbx]).m_ID ,\
ADDR (MYTHREADTLSDATA PTR [rbx]).m_Name,(MYTHREADTLSDATA PTR [rbx]).m_xx,(MYTHREADTLSDATA PTR [rbx]).m_yy

Invoke GetDC, hOutwnd 
mov hdc, rax
invoke SelectObject,hdc,hFont
invoke SetBkMode,hdc,TRANSPARENT
invoke SetTextColor,hdc,(MYTHREADTLSDATA PTR [rbx]).m_Coror
invoke TextOut,hdc,(MYTHREADTLSDATA PTR [rbx]).m_xx,(MYTHREADTLSDATA PTR [rbx]).m_yy,addr szBuf,sizeof szBuf
Invoke ReleaseDC, hOutwnd, hdc

return TRUE

ThreadFunc ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
StartThread PROC USES RBX RDI Parameters:QWORD
Local hm:QWORD
Local dwThreadID:DWORD
LOCAL rc:RECT

;// Load the DLL
invoke LoadLibrary,CStr("testdll_2.dll")
.if rax == NULL
invoke ErrorMessage,CStr("DLL failed to load")
return FALSE
.else
mov hm,rax
.endif

invoke GetClientRect, hOutwnd, ADDR rc

mov eax,rc.right
sub eax,rc.left
mov winClientW,eax

mov eax,rc.bottom
sub eax,rc.top
mov winClientH,eax

xor rbx,rbx
lea rdi,hThreadBuf
.while rbx < THREADCOUNT
invoke CreateThread, NULL, 0, offset ThreadFunc,NULL,NULL, addr dwThreadID
.if rax == NULL
invoke ErrorMessage,CStr("CreateThread error")
return FALSE
.endif
mov [rdi+8*rbx],rax
inc rbx
.endw
invoke WaitForMultipleObjects,THREADCOUNT,addr hThreadBuf,TRUE, INFINITE
invoke FreeLibrary,hm

return TRUE

StartThread ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
_CloseThreadHandle Proc USES RBX RDI phThread:qword,tNum:qword

xor rbx,rbx
lea rdi,phThread
.while rbx < tNum
mov rax,[rdi+8*rbx]
invoke CloseHandle,rax
inc rbx
.endw
ret   

_CloseThreadHandle EndP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
_ProcDlgMain proc  hWnd:qword,wMsg:dword,wParam:qword,lParam:qword
Local dwThreadID:DWORD

mov eax,wMsg
.if eax == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetDlgItem,hWnd,IDC_OUTPUT
mov hOutwnd,rax

invoke  CreateFont,14,0,0,0,FW_BOLD,FALSE,FALSE,FALSE, \
    DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, \
    DEFAULT_QUALITY,FIXED_PITCH, CStr("Cambria")
mov hFont, rax

.elseif eax == WM_COMMAND
mov rax,wParam
.if ax == IDC_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL

.elseif ax == IDC_STAR
mov ThreadIndex,0
invoke CreateThread, NULL, 0, offset StartThread,NULL,NULL, addr dwThreadID
invoke CloseHandle,rax
.endif
.elseif eax == WM_CLOSE
invoke _CloseThreadHandle,hThreadBuf,THREADCOUNT
invoke DeleteObject, hFont
invoke EndDialog,hWnd,NULL
.else
mov rax,FALSE
ret
.endif
mov rax,TRUE
ret

_ProcDlgMain endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WinMainCRTStartup Proc
invoke GetModuleHandle,NULL
mov hInstance,rax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
WinMainCRTStartup Endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

end


TlsTest_2.rc
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include <\UASM64\include\resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 1000
#define DLG_MAIN 100
#define IDC_STAR 101
#define IDC_EXIT 102
#define IDC_OUTPUT 103
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 0, 0, 357, 164
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "TLS_Test2"
FONT 10, "Consolas"
{
LTEXT "", IDC_OUTPUT,2, 2, 352, 145, WS_BORDER
PUSHBUTTON "Start", IDC_STAR,2, 148, 40, 14
PUSHBUTTON "Exit", IDC_EXIT, 314, 148, 40, 14, WS_TABSTOP
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "MICON.ico"

Say you, Say me, Say the codes together for ever.

daydreamer

Thanks six_l :thumbsup:
I am new to this SIMT,except going thru few c examples/ tutorials and make asm versions of them
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