Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //assemble rout.asm on mac with following command
- //nasm -f macho64 rout.asm && clang rout.o -Wl,-no_pie -o a.out
- use std::fs::File;
- use std::io::Write;
- fn savetofile(filename: &str, data: &str){
- let mut f = File::create(filename).expect("Unable to create file");
- f.write_all(data.as_bytes()).expect("Unable to write data");
- }
- fn main() {
- let header = "default rel
- %macro fs 2
- push rax
- push rbx
- push rcx
- push rdx
- push rdi
- push rsi
- push rbp
- push %2
- %1
- pop rbp
- pop rsi
- pop rdi
- pop rdx
- pop rcx
- pop rbx
- pop rax
- %endmacro
- %macro outchar 0
- pop rsi
- push rbp
- mov rbp, rsp
- mov rdi, formatch
- xor rax, rax
- call _printf
- mov rsp, rbp
- pop rbp
- %endmacro
- extern _printf, _exit
- section .data
- formatch db \"%c\", 0, 0
- tape times 1000 dq 0
- section .text
- global _main
- _main:
- push 0
- mov rbx, tape
- ";
- let mut output = "".to_string();
- output.push_str(header);
- let s = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.";
- let mut loopi = 0;
- let mut loopstack = Vec::new();
- for c in s.chars() {
- match c {
- '+' => {
- output.push_str("mov rax, qword [rbx]\n");
- output.push_str("add rax, 1\n");
- output.push_str("mov qword [rbx], rax\n");
- },
- '-' => {
- output.push_str("mov rax, qword [rbx]\n");
- output.push_str("sub rax, 1\n");
- output.push_str("mov qword [rbx], rax\n");
- },
- '>' => {
- output.push_str("add rbx, 8\n");
- },
- '<' => {
- output.push_str("sub rbx, 8\n");
- },
- '[' => {
- let name = format!("loop{}", loopi);
- output.push_str(&format!("{}:\n", name));
- loopstack.push(name);
- loopi += 1;
- },
- ']' => {
- output.push_str("cmp qword [rbx], 0\n");
- output.push_str(&format!("jne {}\n", loopstack.last().unwrap()));
- loopstack.pop();
- }
- '.' => {
- output.push_str("mov rcx, qword [rbx]\n");
- output.push_str("fs outchar, rcx\n");
- }
- _ => {},
- }
- }
- output.push_str("mov rdi, 0\n");
- output.push_str("call _exit\n");
- savetofile("rout.asm", &output);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement