diff --git a/code/asm/hello_nasm.asm b/code/asm/hello_nasm.asm index 32e936a..fd84ca7 100644 --- a/code/asm/hello_nasm.asm +++ b/code/asm/hello_nasm.asm @@ -9,7 +9,7 @@ extern WriteConsoleA ; Data section section .data message db "Hello, NASM!", 13, 10, 0 ; String with CRLF and null terminator - message_len equ $ - message ; Calculate string length + message_len equ $ - message ; Calculate string length ; Code section section .text diff --git a/code/asm/hello_slices.asm b/code/asm/hello_slices.asm new file mode 100644 index 0000000..d8c2f06 --- /dev/null +++ b/code/asm/hello_slices.asm @@ -0,0 +1,81 @@ +; Hello Slices! + +%define marg + +%define rcounter_32 ecx + +%define reg8_32 r8d + +%define raccumulator rax +%define rcounter rcx +%define rdata rdx +%define rstack_ptr rsp +%define rstack_base_ptr rbp + +%define reg9 r9 + +%define MS_STD_OUTPUT_HANDLE 11 + +struc Slice_Byte + .ptr: resq 1 + .len: resq 1 +endstruc + +struc Slice_Str8 + .ptr: resq 1 + .len: resq 1 +endstruc + +; Usage: lit %1: %2: +%macro lit 2 + lit_ %+ %1: db %2 + lit_ %+ %1 %+ _len: equ $ - (lit_ %+ %1) +%endmacro + +BITS 64 ; Explicitly specify 64-bit mode +DEFAULT REL ; Use RIP-relative addressing by default + +; kernel32.lib +extern GetStdHandle +extern WriteConsoleA + +section .data + std_out_hndl dq 0 + +section .lits progbits noexec nowrite + lit hello_msg, `Hello Slices\n` + +section .text +global main + +%define wapi_shadow_width 48 +%macro wapi_shadow_space 0 + push rstack_base_ptr + mov rstack_base_ptr, rstack_ptr + sub rstack_ptr, wapi_shadow_width +%endmacro +%define wapi_arg4_offset 28 +%define wapi_arg5_offset 32 + +%define wapi_write_console_written_chars reg9 +%macro wapi_write_console 2 + mov rcounter,[%1] ; Console Handle + lea rdata, [%2] ; Slice_Str8.Ptr + mov reg8_32, %2 %+ _len ; Slice_Str8.Len + lea reg9, [rstack_ptr + wapi_arg4_offset] ; Written chars + mov qword [rstack_ptr + wapi_arg5_offset], 0 ; Reserved (must be 0) + call WriteConsoleA +%endmacro + +main: + wapi_shadow_space + +; Setup stdout handle + mov rcounter_32, -MS_STD_OUTPUT_HANDLE + call GetStdHandle + mov [std_out_hndl], raccumulator + + wapi_write_console std_out_hndl, lit_hello_msg + + leave + ret diff --git a/code/pkg_mappings.odin b/code/pkg_mappings.odin index 00f9345..7226656 100644 --- a/code/pkg_mappings.odin +++ b/code/pkg_mappings.odin @@ -1,3 +1,3 @@ package asmduff -import +// import diff --git a/scripts/build_hello_nasm.ps1 b/scripts/build_hello_nasm.ps1 index 171d472..e9dc3e5 100644 --- a/scripts/build_hello_nasm.ps1 +++ b/scripts/build_hello_nasm.ps1 @@ -1,2 +1,75 @@ -$nasm = 'nasm' -& $nasm -help +$ps1_devshell = join-path $PSScriptRoot 'helpers/devshell.ps1' +. $ps1_devshell -arch amd64 +$path_root = split-path -Path $PSScriptRoot -Parent +$path_build = join-path $path_root 'build' +$path_code = join-path $path_root 'code' +$path_asm = join-path $path_code 'asm' +$path_toolchain = join-path $path_root 'toolchain' +$path_radlink = join-path $path_toolchain 'radlink' + +if ((test-path $path_build) -eq $false) { + new-item -itemtype directory -path $path_build +} + +$hello_nasm = join-path $path_asm 'hello_nasm.asm' +$listing = join-path $path_build 'hello_nasm.list' +$link_obj = join-path $path_build 'hello_nasm.o' +$exe = join-path $path_build 'hello_nasm.exe' + +$nasm = 'nasm' +$radlink = join-path $path_radlink 'radlink.exe' + +push-location $path_root +$f_assemble_only = '-a' +$f_bin_fmt_coff = '-f coff' +$f_bin_fmt_win64 = '-f win64' +$f_debug = '-g' +$f_debug_fmt_win64 = '-g cv8' +$f_dmacro = '-Dmacro=' +$f_Ipath = '-Ipath ' +$f_listing = '-l' +$f_preprocess_only = '-E' +$f_optimize_none = '-O0' +$f_optimize_min = '-O1' +$f_optimize_multi = '-Ox' +$f_optimize_multi_disp = '-Ov' +$f_outfile = '-o ' +$f_warnings_as_errors = '-Werror' +$args = @( + $hello_nasm, + $f_optimize_none, + $f_bin_fmt_win64, + $f_debug_fmt_win64, + ($f_listing + $listing), + ($f_outfile + $link_obj) +) +& $nasm $args + +$lib_kernel32 = 'kernel32.lib' +$lib_msvcrt = 'msvcrt.lib' + +$link = 'link.exe' + +$link_debug = '/DEBUG:' +$link_entrypoint = '/ENTRY:' +$link_library = '/' +$link_outfile = '/OUT:' +$link_win_machine_64 = '/MACHINE:X64' +$link_win_subsystem_console = '/SUBSYSTEM:CONSOLE' +$link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS' +$rad_debug = '/RAD_DEBUG' +$rad_debug_name = '/RAD_DEBUG_NAME:' +$rad_large_pages = '/RAD_LARGE_PAGES:' +$args = @( + $rad_debug, + # ($link_debug + 'FULL'), + $link_win_machine_64, + $link_win_subsystem_console, + $lib_kernel32, + # $lib_msvcrt, + ($link_entrypoint + 'main'), + ($link_outfile + $exe), + $link_obj +) +& $radlink $args +pop-location diff --git a/scripts/build_hello_slices.ps1 b/scripts/build_hello_slices.ps1 new file mode 100644 index 0000000..3b5bb6a --- /dev/null +++ b/scripts/build_hello_slices.ps1 @@ -0,0 +1,76 @@ +$ps1_devshell = join-path $PSScriptRoot 'helpers/devshell.ps1' +. $ps1_devshell -arch amd64 +$path_root = split-path -Path $PSScriptRoot -Parent +$path_build = join-path $path_root 'build' +$path_code = join-path $path_root 'code' +$path_asm = join-path $path_code 'asm' +$path_toolchain = join-path $path_root 'toolchain' +$path_radlink = join-path $path_toolchain 'radlink' + +if ((test-path $path_build) -eq $false) { + new-item -itemtype directory -path $path_build +} + +$hello_nasm = join-path $path_asm 'hello_slices.asm' +$listing = join-path $path_build 'hello_slices.list' +$link_obj = join-path $path_build 'hello_slices.o' +$exe = join-path $path_build 'hello_slices.exe' + +$nasm = 'nasm' +$radlink = join-path $path_radlink 'radlink.exe' + +push-location $path_root +$f_assemble_only = '-a' +$f_bin_fmt_coff = '-f coff' +$f_bin_fmt_win64 = '-f win64' +$f_debug = '-g' +$f_debug_fmt_win64 = '-g cv8' +$f_dmacro = '-Dmacro=' +$f_Ipath = '-Ipath ' +$f_listing = '-l' +$f_preprocess_only = '-E' +$f_optimize_none = '-O0' +$f_optimize_min = '-O1' +$f_optimize_multi = '-Ox' +$f_optimize_multi_disp = '-Ov' +$f_outfile = '-o ' +$f_warnings_as_errors = '-Werror' +$args = @( + $hello_nasm, + $f_optimize_none, + # $f_preprocess_only, + $f_bin_fmt_win64, + $f_debug_fmt_win64, + ($f_listing + $listing), + ($f_outfile + $link_obj) +) +& $nasm $args + +$lib_kernel32 = 'kernel32.lib' +$lib_msvcrt = 'msvcrt.lib' + +$link = 'link.exe' + +$link_debug = '/DEBUG:' +$link_entrypoint = '/ENTRY:' +$link_library = '/' +$link_outfile = '/OUT:' +$link_win_machine_64 = '/MACHINE:X64' +$link_win_subsystem_console = '/SUBSYSTEM:CONSOLE' +$link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS' +$rad_debug = '/RAD_DEBUG' +$rad_debug_name = '/RAD_DEBUG_NAME:' +$rad_large_pages = '/RAD_LARGE_PAGES:' +$args = @( + $rad_debug, + # ($link_debug + 'FULL'), + $link_win_machine_64, + $link_win_subsystem_console, + $lib_kernel32, + # $lib_msvcrt, + ($link_entrypoint + 'main'), + ($link_outfile + $exe), + $link_obj +) +& $radlink $args +pop-location diff --git a/scripts/helpers/devshell.ps1 b/scripts/helpers/devshell.ps1 new file mode 100644 index 0000000..33ca0ce --- /dev/null +++ b/scripts/helpers/devshell.ps1 @@ -0,0 +1,28 @@ +if ($env:VCINSTALLDIR) { + return +} + +$ErrorActionPreference = "Stop" + +# Use vswhere to find the latest Visual Studio installation +$vswhere_out = & "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath +if ($null -eq $vswhere_out) { + Write-Host "ERROR: Visual Studio installation not found" + exit 1 +} + +# Find Launch-VsDevShell.ps1 in the Visual Studio installation +$vs_path = $vswhere_out +$vs_devshell = Join-Path $vs_path "\Common7\Tools\Launch-VsDevShell.ps1" + +if ( -not (Test-Path $vs_devshell) ) { + Write-Host "ERROR: Launch-VsDevShell.ps1 not found in Visual Studio installation" + Write-Host Tested path: $vs_devshell + exit 1 +} + +# Launch the Visual Studio Developer Shell +Push-Location +write-host @args +& $vs_devshell @args +Pop-Location diff --git a/toolchain/radlink/radlink.exe b/toolchain/radlink/radlink.exe new file mode 100644 index 0000000..e5b1bab Binary files /dev/null and b/toolchain/radlink/radlink.exe differ diff --git a/toolchain/radlink/radlink.pdb b/toolchain/radlink/radlink.pdb new file mode 100644 index 0000000..3f5e0b4 Binary files /dev/null and b/toolchain/radlink/radlink.pdb differ diff --git a/toolchain/readme.md b/toolchain/readme.md index 7cc055e..6007e3c 100644 --- a/toolchain/readme.md +++ b/toolchain/readme.md @@ -4,3 +4,10 @@ Repo: https://github.com/Ed94/gencpp.git Commit: 685bba36d5ed64b48908c950fbbb7f1dbb297120 + +## NASM + +Version: 2.16.03 +Installed Via: scoop + +## RAD Linker