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); ]); ]