Unsafe block detected. Extermination initiated. There is no hiding from memory safety!
System.out.println
Oh you fancy PC people and your fancy
syscall
instruction.I still don’t know why I could remember
jsr $ab1e
. I didn’t even write that much assembly.That looks like a 6502 instruction. What system is it from?
Personally,
echo Hello World!
use std::process::Command; fn main() { Command::new("sh") .arg("-c") .arg("echo Hello World!") .spawn() .unwrap(); }
Like this?
No, more like
use std::process::Command; fn main() { Command::new("sh").arg("-c").arg("echo Hello World!").spawn().unwrap(); }
.
Just a little bit shorter, as it seems /s
Or, you could just go the whole hog. Create your own simple CPU emulator, design a basic 8bitesque CPU, give it an output port that is the console, and load up some basic ASM to cycle through Hello World to the console port.
Definitely left. Right one won’t be optimized. (And there are
so manysome mistakes in your inline asm…)What mistakes?
Mostly the missing listing of clobbered registers. Other than that it’s mostly just that you’re doing useless things, like manually putting the stuff into the registers instead of letting the compiler do it, and the useless push and pop. And the loop is obviously not needed and would hurt performance if you do every write like that.
asm!( "syscall", in("rax") 1, in("rdi") 1, in("rsi") text_ptr, in("rdx") text_size, )
(“so many” was inappropriate, sorry.)
I am hopeless at getting the text_ptr simpler than i64::from_str_radix(&format!(“{:p}”, my_string)[2…], 16).unwrap(); How can i get it the normal way?
Just use
str::as_ptr()
.Here’s an example (disclaimer: I haven’t used inline asm in rust before, expect issues): https://godbolt.org/z/sczYGe96f
Console.WriteLine("Hello World!");