How to test:
ASM CODE:
;**********************************************************
option casemap:none
option frame:auto
OPTION STACKBASE:RSP
.code
sub1 proc private dest:ptr, src:ptr, val1 : qword, val2:qword
mov dest, rcx
mov src, rdx
mov val1, r8
mov val2, r9
mov rax, qword ptr [rdx]
add rax, val1
add rax, val2
mov qword ptr [rcx], rax
ret
sub1 endp
getSum proc public dest:ptr, src:ptr, val1 : qword, val2:qword
mov dest, rcx
mov src, rdx
mov val1, r8
mov val2, r9
INVOKE sub1, dest, src, val1, val2
ret
getSum endp
end
;******************************************
called from a C++ program:
#include "stdafx.h"
#if defined (__cplusplus)
extern "C" {
#endif
void getSum(size_t*dest, size_t*src, size_t val1, size_t val2);
#if defined (__cplusplus)
}
#endif
int main()
{
size_t *src = new (size_t);
size_t *dest = new (size_t);
size_t val1 = 1;
size_t val2 = 2;
*src = 1000;
getSum(dest, src, val1, val2);
printf("Result: %d\n", *dest);
return 0;
}
// How the getSum decompiles?
getSum:
000000013FA81825 mov qword ptr [rsp+8],rcx
000000013FA8182A mov qword ptr [rsp+10h],rdx
000000013FA8182F mov qword ptr [rsp+18h],r8
000000013FA81834 mov qword ptr [rsp+20h],r9
000000013FA81839 sub rsp,20h
000000013FA8183D mov rcx,qword ptr [rsp+8]
000000013FA81842 mov rdx,qword ptr [rsp+10h]
000000013FA81847 mov r8,qword ptr [rsp+18h]
000000013FA8184C mov r9,qword ptr [rsp+20h]
000000013FA81851 call 000000013FA81800
000000013FA81856 add rsp,20h
000000013FA8185A ret :icon13:
Note also that the stack pointer is not realigned to a 16-byte boundary by the sub rsp, 20h! 