The MASM Forum
64 bit assembler => 64 Bit Assembler => Topic started by: assembler on December 24, 2016, 07:59:09 AM
-
What's wrong with this code:
includelib msvcrt.lib
includelib ucrt.lib
includelib libucrt.lib
includelib user32.lib
includelib kernel32.lib
extrn system :proc
extrn puts :proc
extrn printf :proc
extrn ExitProcess :proc
.data
string_title_x64_printf db "title x64 printf",0
string_color_0F db "color 0F",0
string_pause db "pause",0
string db "string",0
string_pd_newline db "%d",10,0
.code
main proc c
lea rcx, string_title_x64_printf
call system
lea rcx, string_color_0F
call system
lea rcx, string
call puts
lea rcx, string_pd_newline
mov rdx, 3
call printf
lea rcx, string_pause
call system
call ExitProcess
main endp
end
This exception is thrown:
Unhandled exception at 0x0000000077528F24 (ntdll.dll) in x64 printf.exe: 0xC0000005: Access violation writing location 0x0000000000000024.
Note that I am running this x64 code in Visual Studio 2015 Enterprise.
-
Works for me, but with some modifications, see attached project. Where exactly does it crash? What do you see in the debugger?
-
Works for me, but with some modifications, see attached project. Where exactly does it crash? What do you see in the debugger?
It crashes on line/instruction: "call printf".
In the debugger I see the exception, which I already quoted in the question and I will quote it again:
Unhandled exception at 0x0000000077528F24 (ntdll.dll) in x64 printf.exe: 0xC0000005: Access violation writing location 0x0000000000000024.
And I don't have the requirements of your modifications. Visual Studio 2015 Enterprise doesn't come with include files (.inc files) for masm at all!
-
It crashes on line/instruction: "call printf".
Interesting.
lea rcx, string_pd_newline
mov rdx, 11111
call printf
lea rcx, string_pd_newline
mov rdx, 22222
jinvoke crt_printf, @
jinvoke crt_printf, addr string_pd_newline, 33333
All three variants work, output is ...
11111
22222
33333... as expected, no exceptions here 8)
-
Unhandled exception at 0x0000000077528F24 (ntdll.dll) in x64 printf.exe: 0xC0000005: Access violation writing location 0x0000000000000024.
I think the problem in Stack Alignement, Check out Frame Prologue
-
Unlikely: Access violation writing location 0x0000000000000024
Doesn't look like a stack alignment problem...
-
One of the thing I learnt when first doing research on x64 with ML64 was that if you want to use high level code (c runtime etc..) you must construct a stack frame that is aligned correctly. For pure mnemonic code, you don't need a stack frame.
JJ is correct here, if you are getting a page fault from OFFSET 24, you have an addressing error in you code somewhere. Sounds like a null pointer with an added offset.
-
Unlikely: Access violation writing location 0x0000000000000024
Doesn't look like a stack alignment problem...
you are right JJ, thank you
the code worked properly without ucrt.lib and libucrt.lib
includelib msvcrt.lib
;includelib ucrt.lib
;includelib libucrt.lib
;includelib user32.lib
includelib kernel32.lib
extrn system :proc
extrn puts :proc
extrn printf :proc
extrn ExitProcess :proc
.data
string_title_x64_printf db "title x64 printf",0
string_color_0F db "color 0F",0
string_pause db "pause",0
string db "string",0
string_pd_newline db "%d",10,0
.code
main proc c
lea rcx, string_title_x64_printf
call system
lea rcx, string_color_0F
call system
lea rcx, string
call puts
lea rcx, string_pd_newline
mov rdx, 3
call printf
lea rcx, string_pause
call system
call ExitProcess
main endp
end
-
Shadow space created with the sub command :
includelib msvcrt.lib
includelib kernel32.lib
EXTRN system:PROC
EXTRN puts:PROC
EXTRN printf:PROC
EXTRN ExitProcess:PROC
.data
string_title_x64_printf db "title x64 printf",0
string_color_0F db "color 0F",0
string_pause db "pause",0
string db "string",0
string_pd_newline db "%d",10,0
.code
mainCRTStartup PROC C
sub rsp,4*8
lea rcx, string_title_x64_printf
call system
lea rcx, string_color_0F
call system
lea rcx, string
call puts
lea rcx, string_pd_newline
mov rdx, 3
call printf
lea rcx, string_pause
call system
call ExitProcess
ret
mainCRTStartup ENDP
END
-
sub rsp,4*8Don't you need another 8? The entry is aligned 8, not 16, unless C does things differently?
-
Hi sinsi,
The statement mainCRTStartup PROC C creates a stack frame. Disassembling the object module with Agner Fog's objconv :
mainCRTStartup PROC
push rbp
mov rbp, rsp
sub rsp, 32
lea rcx, ptr [string_title_x64_printf]
call system
lea rcx, ptr [string_color_0F]
call system
lea rcx, ptr [string]
call puts
lea rcx, ptr [string_pd_newline]
mov rdx, 3
call printf
lea rcx, ptr [string_pause]
call system
call ExitProcess
leave
ret
mainCRTStartup ENDP
-
What msvc 2015 in C do?
void __declspec(noreturn) ExitProcess(int);
#pragma comment(lib, "kernel32.lib")
int system(const char *string);
int puts(const char *string);
int printf(const char *format, ...);
#pragma comment(lib, "msvcrt.lib")
char *string_title_x64_printf = "title x64 printf";
char *string_color_0F = "color 0F";
char *string_pause = "pause";
char *string = "string";
char *string_pd_newline = "%d\n";
void mainCRTStartup(void)
{
system(string_title_x64_printf);
system(string_color_0F);
puts(string);
printf(string_pd_newline, 3);
system(string_pause);
ExitProcess(0);
}mainCRTStartup:
sub rsp,28h
mov rcx,qword ptr [string_title_x64_printf]
call system
mov rcx,qword ptr [string_color_0F]
call system
mov rcx,qword ptr [string]
call puts
mov rcx,qword ptr [string_pd_newline]
mov edx,3
call printf
mov rcx,qword ptr [string_pause]
call system
xor ecx,ecx
call ExitProcess
and ml64.exemainCRTStartup:
push rbp
mov rbp,rsp
lea rcx,[string_title_x64_printf]
call system
lea rcx,[string_color_0F]
call system
lea rcx,[string]
call puts
lea rcx,[string_pd_newline]
mov rdx,3
call printf
lea rcx,[string_pause]
call system
call ExitProcess
leave
ret
-
The statement mainCRTStartup PROC C creates a stack frame.
:t
-
I'm almost sure the problem is in MS VS
Try assembling your project from command line