123 lines
3.4 KiB
OCaml
123 lines
3.4 KiB
OCaml
open Util.Assert
|
|
open X86
|
|
open Sim.Simulator
|
|
open Gradedtests
|
|
open Asm
|
|
(* These tests are provided by you -- they will be graded manually *)
|
|
|
|
(* You should also add additional test cases here to help you *)
|
|
(* debug your program. *)
|
|
|
|
|
|
let test_my =
|
|
let bin = [
|
|
InsB0 (Movq, Asm.[ ~$42; ~%Rax ]);
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
]
|
|
|
|
in
|
|
|
|
let asm = [gtext "main"
|
|
[
|
|
Movq, [~$42; ~%Rax]];
|
|
] in
|
|
|
|
(assert_eqf (fun() -> (assemble asm).text_seg) bin )
|
|
|
|
|
|
let mov_ri =
|
|
test_machine
|
|
[
|
|
InsB0 (Movq, Asm.[ ~$42; ~%Rax ]);
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
InsFrag;
|
|
]
|
|
|
|
let crack_tests =
|
|
let open Asm in
|
|
let pu = (Pushq, [~$42]) in
|
|
let po = (Popq, [~%Rax]) in
|
|
let ca = (Callq, [Ind2 Rax]) in
|
|
let re = (Retq, []) in
|
|
[
|
|
("crack_pushq", assert_eqf (fun() ->
|
|
crack pu) ([ Subq, [Imm (Lit 8L); Reg Rsp]
|
|
; Movq, [~$42; Ind2 Rsp] ]));
|
|
("crack_pop", assert_eqf (fun() ->
|
|
crack po) ([ Movq, [Ind2 Rsp; Reg Rax]
|
|
; Addq, [Imm (Lit 8L); Reg Rsp] ]));
|
|
("crack_call", assert_eqf (fun() ->
|
|
crack ca) ([ Subq, [Imm (Lit 8L); Reg Rsp]
|
|
; Movq, [Reg Rip; Ind2 Rsp]
|
|
; Jmp, [Ind2 Rax] ]));
|
|
("crack retq", assert_eqf (fun() ->
|
|
crack re) ([ Movq, [Ind2 Rsp; Reg Rip]
|
|
; Addq, [Imm (Lit 8L); Reg Rsp] ]));
|
|
|
|
]
|
|
|
|
let fib_rec n = [ text "fib"
|
|
[ Cmpq, [~$1; ~%Rdi]
|
|
; J Eq, [Imm (Lbl "exit1")]
|
|
; Cmpq, [~$2; ~%Rdi]
|
|
; J Eq, [Imm (Lbl "exit2")]
|
|
; Movq, [~$0; ~%R08]
|
|
; Movq, [~$1; ~%R09]
|
|
; Movq, [~$2; ~%R11]
|
|
]
|
|
; text "loop"
|
|
[ Cmpq, [~%Rdi; ~%R11]
|
|
; J Eq, [Imm (Lbl "exit")]
|
|
; Movq, [~%R09; ~%R10]
|
|
; Addq, [~%R08; ~%R10]
|
|
; Movq, [~%R09; ~%R08]
|
|
; Movq, [~%R10; ~%R09]
|
|
; Addq, [~$1; ~%R11]
|
|
; Jmp, [Imm (Lbl "loop")]
|
|
]
|
|
; text "exit"
|
|
[ Movq, [~%R09; ~%Rax]
|
|
; Retq, []
|
|
]
|
|
; text "exit1"
|
|
[ Movq, [~$0; ~%Rax]
|
|
; Retq, []
|
|
]
|
|
; text "exit2"
|
|
[ Movq, [~$1; ~%Rax]
|
|
; Retq, []
|
|
]
|
|
; gtext "main"
|
|
[ Movq, [~$n; ~%Rdi]
|
|
; Callq, [~$$"fib"]
|
|
; Retq, []
|
|
]
|
|
]
|
|
|
|
let provided_tests : suite = [
|
|
|
|
Test ("My Tests", [
|
|
("assert", test_my)
|
|
]);
|
|
|
|
Test ("Student provided crack tests", crack_tests);
|
|
|
|
|
|
Test ("Student-Provided Big Test for Part III: Score recorded as PartIIITestCase", [
|
|
("fib", program_test (fib_rec 7) 8L);
|
|
("fib", program_test (fib_rec 8) 13L);
|
|
("fib", program_test (fib_rec 9) 21L);
|
|
]);
|
|
|
|
]
|