almost done... stack errors to deal with now...

This commit is contained in:
2025-06-21 17:28:04 -04:00
parent 39b4be9d7a
commit 9bc1e59bdb
2 changed files with 75 additions and 31 deletions

View File

@ -11,7 +11,7 @@ DEFAULT REL ; Use RIP-relative addressing by default
%define rcounter_32 ecx
%define rdata_32 edx
%define r8_32 r8d
%define r9_32
%define r9_32 r9d
%define raccumulator rax
%define rbase rbx
@ -374,8 +374,8 @@ extern ReadFile
extern ExitProcess
%define MS_INVALID_HANDLE_VALUE -1
%define MS_FILE_ATTRIBUTE_NORMAL 0x00000080
%define MS_FILE_SHARE_READ 0x00000001
%define MS_FILE_ATTRIBUTE_NORMAL 0x00000080
%define MS_FILE_SHARE_READ 0x00000001
%define MS_GENERIC_READ 0x80000000
%define MS_OPEN_EXISTING 3
%define MS_STD_OUTPUT_HANDLE 11
@ -391,7 +391,7 @@ extern ExitProcess
%define wapi_CreateFileA_dwCreationDisposition 32
%define wapi_CreateFileA_dwFlagsAndAttributes 40
%define wpai_CreateFileA_hTemplateFile 48
%define wapi_CreateFileA_hTemplateFile 48
%define wapi_ReadFile_lpOverlapped 32
@ -418,7 +418,7 @@ endstruc
; Reg allocation:
; result: rcounter = [FileOpInfo]
; path: Slice_Str8 = { .ptr = rdata, .len = r8 }
; backing: r9 = [Slice_Byte]
; backing: r9 = [Slice_Byte]
%push proc_scope
%define result rcounter
%define path_ptr rdata
@ -430,17 +430,16 @@ file_read_contents:
assert_not_null result
slice_assert backing
slice_assert path_ptr, path_len
push rbx
push r12
push r13
push r14
push rbase ; id_file
push r12 ; result
push r13 ; backing
push r14 ; file_size
mov r12, result
mov r13, backing
%define result r12
%define backing r13
; rcounter = str8_to_cstr_capped(path, slice_fmem(scratch));
; We're using backing to store the cstr temporarily until ReadFile.
; TODO(Ed): This cannot be done with an allocator interface...
call str8_to_cstr_capped ; (rdata, r8, r9)
; path_cstr = rcounter; path_len has will be discarded in the CreateFileA call
%define path_cstr rcounter
@ -452,54 +451,58 @@ file_read_contents:
xor r9, r9 ; lpSecurityAttributes = nullptr
mov dword [rstack_ptr + wapi_CreateFileA_dwCreationDisposition], MS_OPEN_EXISTING
mov dword [rstack_ptr + wapi_CreateFileA_dwFlagsAndAttributes ], MS_FILE_ATTRIBUTE_NORMAL
mov qword [rstack_ptr + wpai_CreateFileA_hTemplateFile ], nullptr
mov qword [rstack_ptr + wapi_CreateFileA_hTemplateFile ], nullptr
call CreateFileA
stack_pop
; B32 open_failed = raccumulator == MS_INVALID_HANDLE_VALUE
; if (open_failed) goto %%.error_exit
assert_cmp jnz, raccumulator, MS_INVALID_HANDLE_VALUE
assert_cmp jne, raccumulator, MS_INVALID_HANDLE_VALUE
je .error_exit
mov rbase, raccumulator ; rbase = id_file
%define id_file rbase
wapi_shadow_space
; rcounter = path_str ; hfile
mov rcounter, id_file
lea rdata, [result + FileOpInfo.content + Slice_Byte.len]; lpFileSize = result.content.len
call GetFileSizeEx
stack_pop
; B32 not_enough_backing = backing.len < result.content.len
; B32 not_enough_backing = result.content.len > backing.len
; if (not_enough_backing) goto .error_exit
mov r8, [backing + Slice_Byte.len]
mov r9, [result + FileOpInfo.content + Slice_Byte.len]
assert_cmp jg, r9, r8
assert_cmp jle, r9, r8
jg .error_exit
; MS_BOOL get_size_failed = rax
; MS_BOOL get_size_failed = ! raccumulator
; if (get_size_failed) goto .error_exit
assert_cmp jnz, raccumulator, false
assert_cmp jne, raccumulator, false
je .error_exit
; push r14 ; file_size
%define file_size r14d
mov r14d, r9d
mov r14d, r9d
wapi_shadow_space
mov rcounter, id_file ; hfile: rcounter = rbase
mov rdata, [backing + Slice_Byte.ptr ] ; lpBuffer: rdata = backing.ptr
mov r8_32, file_size ; nNumberOfBytesRead: r8_32 = file_size
mov r9, [result + FileOpInfo.content + Slice_Byte.len] ; lpNumberOfBytesToRead: r9 = & result.content.len
mov qword [rstack_ptr + wapi_ReadFile_lpOverlapped], 0 ; lpOverlapped: nullptr
mov rcounter, id_file ; hfile: rcounter = rbase
mov rdata, [backing + Slice_Byte.ptr ] ; lpBuffer: rdata = backing.ptr
mov r8_32, file_size ; nNumberOfBytesToRead: r8_32 = file_size
lea r9, [result + FileOpInfo.content + Slice_Byte.len] ; lpNumberOfBytesRead: r9 = & result.content.len
mov qword [rstack_ptr + wapi_ReadFile_lpOverlapped], 0 ; lpOverlapped: nullptr
call ReadFile
stack_pop
; B32 read_failed = ! read_result
; read_failed |= amount_read != result.content.len
; if (read_failed) goto .error_exit
assert_cmp jnz, raccumulator, false
je .error_exit
assert_cmp je, amount_read, r9
je .error_exit
; read_failed |= amount_read != result.content.len
; if (read_failed) goto .error_exit
mov r9, qword [result + FileOpInfo.content + Slice_Byte.len]
assert_cmp je, file_size, r9d
jne .error_exit
; CloseHandle(id_file)
wapi_shadow_space
@ -518,10 +521,10 @@ file_read_contents:
mov qword [result + FileOpInfo.content + Slice_Byte.len], 0
.cleanup:
pop file_size
pop result
pop r14 ; file_size
pop backing
pop rbase
pop result
pop id_file
ret
%pop proc_scope
@ -546,6 +549,7 @@ global main
mov rcounter_32, -MS_STD_OUTPUT_HANDLE
call GetStdHandle
mov [std_out_hndl], raccumulator
stack_pop
%push proc_scope
; dbg_wipe_gprs
@ -560,8 +564,18 @@ global main
mov r8, [path_hello_files_asm + Str8.len] ; r9 = path_hello_files.len
lea r9, [local_backing]
call file_read_contents ; read_file_contents(rcounter, rdata, r8, r9)
stack_pop
%pop calling
wapi_shadow_space
mov rcounter, [std_out_hndl]
lea rdata, [file + FileOpInfo.content + Slice_Byte.ptr]
mov r8_32, [file + FileOpInfo.content + Slice_Byte.len]
lea r9, [rstack_ptr + wapi_arg4_offset]
mov qword [rstack_ptr + wapi_arg5_offset], 0
call WriteConsoleA
stack_pop
; Exit program
wapi_shadow_space
xor ecx, ecx ; Exit code 0

View File

@ -79,11 +79,41 @@ breakpoint:
}
breakpoint:
{
source_location: "hello_files.asm:429:1"
source_location: "hello_files.asm:444:1"
hit_count: 1
}
breakpoint:
{
source_location: "hello_files.asm:467:1"
source_location: "hello_files.asm:475:1"
hit_count: 1
}
breakpoint:
{
source_location: "hello_files.asm:506:1"
hit_count: 1
}
breakpoint:
{
source_location: "hello_files.asm:501:1"
hit_count: 1
}
breakpoint:
{
source_location: "hello_files.asm:495:1"
hit_count: 1
}
breakpoint:
{
source_location: "hello_files.asm:470:1"
hit_count: 1
}
breakpoint:
{
source_location: "hello_files.asm:456:1"
hit_count: 1
}
breakpoint:
{
source_location: "hello_files.asm:571:1"
hit_count: 0
}