From e7a37a1f53654b312a37d74f9a2e9fc3140cc108 Mon Sep 17 00:00:00 2001 From: MCorange Date: Wed, 29 Mar 2023 16:13:51 +0300 Subject: [PATCH] honestly just fuck windows --- kernel32.def | 5 +++ libkernel32.a | Bin 0 -> 3624 bytes src/compile/win32_x86_64/commands.rs | 22 +++++----- src/compile/win32_x86_64/mod.rs | 38 +++++++++++----- src/constants.rs | 11 ++++- test.mcl | 2 +- test.nasm | 62 +++++++++++++++++++++++++++ test.o | Bin 0 -> 748 bytes 8 files changed, 115 insertions(+), 25 deletions(-) create mode 100644 kernel32.def create mode 100644 libkernel32.a create mode 100644 test.nasm create mode 100644 test.o diff --git a/kernel32.def b/kernel32.def new file mode 100644 index 0000000..92014a5 --- /dev/null +++ b/kernel32.def @@ -0,0 +1,5 @@ +LIBRARY KERNEL32.DLL +EXPORTS + WriteConsoleA + GetStdHandle + ExitProcess \ No newline at end of file diff --git a/libkernel32.a b/libkernel32.a new file mode 100644 index 0000000000000000000000000000000000000000..d3674335ffbd5bee69dcb2660e2f6063cb26444e GIT binary patch literal 3624 zcmeHKO>fgc5FN*D6GHjs0EmN;3gUoL$7$SD6jTHiNJOZD0}>a)~jp`?9?3m{#>0uDe#RdA{Sg zJfwTasWv?MgH{;;N_hPOu)hH;tc$Dk6T^62{Xtg{^yBSbG#W(xniqsYJP3Cq2!d`D zw#^|3K9AxgdOaMBhyCakV&dJsU^4hNN;wqJxC{)13outI`gWa5{uX zHo!fqY~zEUVc!WC(}YVa3Oa|KIeaeNcs_xvt2p6G({ZZ`cN05{IXE@`e)Hpp&1TK3 zylFNmR_Vl;5@ElO0lr$Du%`ktu5(3G+Y|E>Oy{XE4Wn^nPs3>Z(4K9JylIj{=4Kv; zPQfrQlzrQ}W=zr~Z$DO18Jhj|i zej0##GN+W6JpC!W-fFm1&-%FP6HfIf+eHi%fjpheBJ)F;D$bg~Ld)V^CIydO zG*8I*tP1K^S2YC}dD#ObkX|5p3Z|FJGaTQNN}}c*6`WQ);%5aH`=YH2S*0~9Xah0r zd|awvnr|I3gM6Hi!)$btHzY=euyKx#AJg68VHTtOnQuwTC#^&I2e^Wl;Fs?8-U;oV zth1oMdAO>A)DtsAtJo@%RZJD(T^lOo{n0ZB)za_DXrn@fclaKFPM3&0l@V$R@B;nh z`#<-iAn$7;Q)zWpmFji&Ql&EY|D;k2jBhf|?nPDUZK=sjrB7spngTpW9~j%s{VY9Q zqwcI4tzA}9MwUXLk{4Kc98oh=4Cd)LsBm(RUu!e1*Z&ymx4CVYM GEB^t-oxPX< literal 0 HcmV?d00001 diff --git a/src/compile/win32_x86_64/commands.rs b/src/compile/win32_x86_64/commands.rs index 2b20a41..59f402a 100644 --- a/src/compile/win32_x86_64/commands.rs +++ b/src/compile/win32_x86_64/commands.rs @@ -4,7 +4,7 @@ use color_eyre::Result; use crate::compile::Folders; use crate::info; -pub fn linux_x86_64_compile_and_link(folders: &Folders, quiet: bool) -> Result<()> { +pub fn cmpile_and_link(folders: &Folders, quiet: bool) -> Result<()> { let nasm_args = [ "-fwin32", @@ -17,14 +17,12 @@ pub fn linux_x86_64_compile_and_link(folders: &Folders, quiet: bool) -> Result<( folders.of_o.to_str().unwrap(), "-o", folders.of_c.to_str().unwrap(), - "-L", - "C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0\\Lib", - "-l", - "kernel32" + "-nostdlib", "-nostartfiles", + "-lC:\\Users\\gvida\\@Projects\\rust\\mclang2\\libkernel32.a", ]; - let mut proc = if cfg!(target_os = "windows") { + let mut proc = if !cfg!(target_os = "windows") { return Ok(()); } else { Command::new("nasm") @@ -43,21 +41,21 @@ pub fn linux_x86_64_compile_and_link(folders: &Folders, quiet: bool) -> Result<( } - let mut proc2 = if cfg!(target_os = "windows") { + let mut proc2 = if !cfg!(target_os = "windows") { return Ok(()); } else { - Command::new("ld") + Command::new("gcc") .args(ld_args) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .spawn()? }; if !quiet { - info!("running 'ld {}'", ld_args.join(" ")); + info!("running 'gcc {}'", ld_args.join(" ")); } let exit2 = proc2.wait()?; if !quiet { - info!("ld process exited with code {}", exit2); + info!("gcc process exited with code {}", exit2); } @@ -65,13 +63,13 @@ pub fn linux_x86_64_compile_and_link(folders: &Folders, quiet: bool) -> Result<( Ok(()) } -pub fn linux_x86_64_run(bin: &Path, args: &[String], quiet: bool) -> Result { +pub fn run(bin: &Path, args: &[String], quiet: bool) -> Result { let bin = PathBuf::from( format!("./{}", bin.to_string_lossy()) ); - let mut proc = if cfg!(target_os = "windows") { + let mut proc = if !cfg!(target_os = "windows") { return Ok(0); } else { Command::new(bin.clone()) diff --git a/src/compile/win32_x86_64/mod.rs b/src/compile/win32_x86_64/mod.rs index 3e1526a..61aa9e7 100644 --- a/src/compile/win32_x86_64/mod.rs +++ b/src/compile/win32_x86_64/mod.rs @@ -2,8 +2,8 @@ mod commands; use std::{fs, io::{Write, BufWriter}}; use crate::{constants::{Operator, OpType, KeywordType}, Args}; use color_eyre::Result; -use commands::linux_x86_64_compile_and_link; -use commands::linux_x86_64_run; +use commands::cmpile_and_link; +use commands::run; use crate::constants::InstructionType; use super::Folders; @@ -18,6 +18,10 @@ pub fn compile(tokens: &[Operator], args: &Args, folders: &Folders) -> Result Result Result>(); @@ -409,9 +427,9 @@ pub fn compile(tokens: &[Operator], args: &Args, folders: &Folders) -> Result panic!("Unknown syscall {n}") + } + + } \ No newline at end of file diff --git a/test.mcl b/test.mcl index c23c68e..1400dd2 100644 --- a/test.mcl +++ b/test.mcl @@ -1,3 +1,3 @@ #ifdef __win32__ - 69 + 10 print #endif \ No newline at end of file diff --git a/test.nasm b/test.nasm new file mode 100644 index 0000000..e08930e --- /dev/null +++ b/test.nasm @@ -0,0 +1,62 @@ +BITS 64 +segment .text +extern WriteConsoleA +extern GetStdHandle +extern ExitProcess +print: + mov r9, -3689348814741910323 + sub rsp, 40 + mov BYTE [rsp+31], 10 + lea rcx, [rsp+30] +.L2: + mov rax, rdi + lea r8, [rsp+32] + mul r9 + mov rax, rdi + sub r8, rcx + shr rdx, 3 + lea rsi, [rdx+rdx*4] + add rsi, rsi + sub rax, rsi + add eax, 48 + mov BYTE [rcx], al + mov rax, rdi + mov rdi, rdx + mov rdx, rcx + sub rcx, 1 + cmp rax, 9 + ja .L2 + lea rax, [rsp+32] + mov edi, 1 + sub rdx, rax + xor eax, eax + lea rsi, [rsp+32+rdx] + mov rdx, r8 + sub rsp, 8+8+32 + mov ecx, -11 + call GetStdHandle + mov rcx, rax + mov r8, rdx + mov rdx, rsi + lea r9, [rsp-16] + mov qword [rsp-56], 0 + add rsp, 8+8+32+40 + call WriteConsoleA + ret +global _start +_start: +sub rsp, 8 +addr_0: + ;; -- push int 10 + mov rax, 10 + push rax +addr_1: + ;; -- print + pop rdi + call print +addr_2: + mov rcx, 0 + call ExitProcess +segment .data +segment .bss +mem: resb 640000 diff --git a/test.o b/test.o new file mode 100644 index 0000000000000000000000000000000000000000..f78909a041788cbd2c360e9b3fa0491a51d90049 GIT binary patch literal 748 zcmZWnJxC)_5T13f(AY@|D^0P5L0C3&jo2vWZ~|KdE%dO6o7<-ZG?CpWXDMvs!UYcD zimR-wENo3>^u#|rxX#+nJFXDHpUQRSt!ok-n0fQQ`QFUDdC%5#m>xCU&l*4)Vlkyy zm#;oAd!*k;$B4tClV+f}V7iWU6w)%Bhc%ILu$pGs_mjO^k9#_{yxAaLq4E1N77YFm zo#c(d6xMBH0K+G{o;Nau$7^y6*)u%+r(^x&7HSWey$zbyrbYn_uQ0s8;ID?kQ_t6P z9xx%^PP54vyzk{1?%?_fv!w zOE>d$s=;9uS|x`AY4}c-uat&evc1YP7c0wxJeKDOU`dn0muA)RS7MNC`=Gf`UE@*n zcw5pw6HE2@|t?ri28}Ed`MEz%Gm+>l#NY{40a%^UZt9R z4%IU##I#5Hi5DX!UpgLZlTrWx literal 0 HcmV?d00001