34 lines
659 B
OCaml
34 lines
659 B
OCaml
open X86
|
|
open Cunit
|
|
|
|
let hello_label = mk_lbl_named "hellostr"
|
|
let puts_label = mk_lbl_named "_puts" (* gcc on linux/mac uses _ to munge names *)
|
|
|
|
let main_seq = [
|
|
Push (esp);
|
|
Mov (ebp, esp);
|
|
|
|
Add (esp, Imm (-8l)); (* Not sure why this has to be 8 *)
|
|
Mov (stack_offset 0l, Lbl hello_label);
|
|
Call (Lbl puts_label);
|
|
|
|
Mov (esp, ebp);
|
|
Pop (ebp);
|
|
Ret
|
|
]
|
|
|
|
let main_bb = {
|
|
(mk_insn_block (mk_lbl_named "_main") main_seq) with
|
|
global = true
|
|
}
|
|
|
|
let hello_data = {
|
|
link = false;
|
|
label = (mk_lbl_named "hellostr");
|
|
value = GStringz "Hello, world!"
|
|
}
|
|
|
|
let cu = [Data hello_data; Code main_bb]
|
|
|
|
let _ =
|
|
print_endline (string_of_cunit cu)
|