Now I have studied fastcall convention masmhelp etc. I have tested several variations on the below test program. As the program is now written, it works. What I don't understand is why extra1 and extra2 are taken from rbp+30h and not from rbp+20h. Is it the return address perhaps?
The code is written in visual studio 2022 community and I use vs libraries.
I would be grateful for comments and recommendations.
OPTION DOTNAME ; required for macro files
option casemap:none ; case sensitive
include \masm32\include64\win64.inc ; main include file
include \masm32\include64\kernel32.inc
include \masm32\include64\user32.inc
include \masm32\include64\Comctl32.inc
include \masm32\include64\ws2_32.inc
public entry_point
WSADATA struct qword
wVersion dw ?
wHighVersion dw ?
iMaxSockets dw ?
iMaxUdpDg dw ?
lpVendorInfo dq ?
szDescription db WSADESCRIPTION_LEN+1 dup (?)
szSystemStatus db WSASYS_STATUS_LEN+1 dup (?)
WSADATA ends
.data?
hInstance dq ?
buffer db 260 dup (?)
.data
szMyText db "My text",0
.code
entry_point proc
local w:char
local z[2]:HWND
local wsadata:WSADATA
sub rsp,2*8
mov w,'y'
lea rax,z
lea r10,szMyText
mov qword ptr [rax],r10
mov qword ptr [rax + 8],r10
xor rcx,rcx
call GetModuleHandle
mov hInstance,rax
mov cx,0202h
lea rdx,wsadata
call testfunction1
xor ecx,ecx
call ExitProcess
ret
entry_point endp
testfunction1 proc ver:word,pWsaData:qword
sub rsp,6*8
mov ver,cx
mov pWsaData,rdx
mov rdx,pWsaData
mov cx,ver
call WSAStartup
test rax,rax
je @F
mov rcx,NULL
lea rdx,szMyText
lea r8,szMyText
mov r9,MB_OK or MB_ICONERROR
call MessageBox
@@:
mov rcx,NULL
lea rdx,szMyText
lea r8,szMyText
mov r9,MB_OK or MB_ICONERROR
mov qword ptr [rsp + 20h],500
mov qword ptr [rsp + 28h],501
call MyMessage
add rsp,6*8
ret
testfunction1 endp
MyMessage proc ;hWin:HWND,pmes:qword,ptitle:qword,pIcon:qword,extra1:qword,extra2:qword
local hWin:HWND ;these four only for testing
local pmes:qword
local ptitle:qword
local pIcon:qword
local extra1:qword
local extra2:qword
sub rsp,4*8
lea rax,extra1
mov rax,qword ptr [rbp + 30h] ;? why not [rbp + 20h]
mov extra1,rax
mov rax,qword ptr [rbp + 38h] ;? why not [rbp + 28h]
mov extra2,rax
mov hWin,rcx ;these four only for testing
mov pmes,rdx
mov ptitle,r8
mov pIcon,r9
call MessageBox
lea rax,extra1
mov rax,extra1
add rax,extra2
add rsp,4*8
ret
MyMessage endp