From 14a380525ed2df295463b1906b718cb26871df3b Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Fri, 30 Nov 2018 16:54:01 -0800 Subject: 4809 - subx: html with 5 colors for comments --- html/subx/apps/factorial.subx.html | 192 +++++++++++++++++++------------------ 1 file changed, 99 insertions(+), 93 deletions(-) (limited to 'html/subx/apps/factorial.subx.html') diff --git a/html/subx/apps/factorial.subx.html b/html/subx/apps/factorial.subx.html index 7dd82030..3ae32e83 100644 --- a/html/subx/apps/factorial.subx.html +++ b/html/subx/apps/factorial.subx.html @@ -11,15 +11,21 @@ @@ -71,97 +77,97 @@ if ('onhashchange' in window) { 15 # When running tests the exit status doesn't mean anything. Yet. 16 17 == code - 18 # instruction effective address operand displacement immediate - 19 # op subop mod rm32 base index scale r32 - 20 # 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes + 18 # instruction effective address register displacement immediate + 19 # . op subop mod rm32 base index scale r32 + 20 # . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes 21 22 # main: - 23 # prolog - 24 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 25 # if (argc > 1) - 26 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP - 27 7e/jump-if-lesser-or-equal $run-main/disp8 - 28 # and if (argv[1] == "test") - 29 # push args - 30 68/push "test"/imm32 - 31 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) - 32 # call - 33 e8/call kernel-string-equal/disp32 - 34 # discard args - 35 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 36 # check result - 37 3d/compare-EAX 1/imm32 - 38 75/jump-if-not-equal $run-main/disp8 - 39 # then return run-tests() - 40 e8/call run-tests/disp32 - 41 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Num-test-failures/disp32 # copy *Num-test-failures to EAX - 42 eb/jump $main:end/disp8 # where EAX will get copied to EBX - 43 # else EAX = factorial(5) - 44 $run-main: - 45 # push args - 46 68/push 5/imm32 - 47 # call - 48 e8/call factorial/disp32 - 49 # discard args - 50 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - 51 $main:end: - 52 # exit(EAX) - 53 89/copy 3/mod/direct 3/rm32/EBX . . . 0/r32/EAX . . # copy EAX to EBX - 54 b8/copy-to-EAX 1/imm32 - 55 cd/syscall 0x80/imm8 - 56 - 57 # factorial(n) - 58 factorial: - 59 # prolog - 60 55/push-EBP - 61 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 62 53/push-EBX - 63 # initialize EAX to 1 (base case) - 64 b8/copy-to-EAX 1/imm32 - 65 # if (n <= 1) jump exit - 66 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 1/imm32 # compare *(EBP+8) - 67 7e/jump-if-<= $factorial:end/disp8 - 68 # EBX = n-1 - 69 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX - 70 81 5/subop/subtract 3/mod/direct 3/rm32/EBX . . . . . 1/imm32 # subtract from EBX - 71 # EAX = factorial(n-1) - 72 # push args - 73 53/push-EBX - 74 # call - 75 e8/call factorial/disp32 - 76 # discard args - 77 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - 78 # return n * factorial(n-1) - 79 f7 4/subop/multiply 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 8/disp8 . # multiply *(EBP+8) into EAX - 80 # TODO: check for overflow + 23 # . prolog + 24 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 25 # - if argc > 1 and argv[1] == "test" then return run_tests() + 26 # . argc > 1 + 27 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP + 28 7e/jump-if-lesser-or-equal $run-main/disp8 + 29 # . argv[1] == "test" + 30 # . . push args + 31 68/push "test"/imm32 + 32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) + 33 # . . call + 34 e8/call kernel-string-equal/disp32 + 35 # . . discard args + 36 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 37 # . check result + 38 3d/compare-EAX 1/imm32 + 39 75/jump-if-not-equal $run-main/disp8 + 40 # . run-tests() + 41 e8/call run-tests/disp32 + 42 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Num-test-failures/disp32 # copy *Num-test-failures to EAX + 43 eb/jump $main:end/disp8 # where EAX will get copied to EBX + 44 # - otherwise return factorial(5) + 45 $run-main: + 46 # . . push args + 47 68/push 5/imm32 + 48 # . . call + 49 e8/call factorial/disp32 + 50 # . . discard args + 51 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 52 $main:end: + 53 # syscall(exit, EAX) + 54 89/copy 3/mod/direct 3/rm32/EBX . . . 0/r32/EAX . . # copy EAX to EBX + 55 b8/copy-to-EAX 1/imm32 + 56 cd/syscall 0x80/imm8 + 57 + 58 factorial: # n : int -> int/EAX + 59 # . prolog + 60 55/push-EBP + 61 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 62 53/push-EBX + 63 # EAX = 1 (base case) + 64 b8/copy-to-EAX 1/imm32 + 65 # if (n <= 1) return + 66 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 1/imm32 # compare *(EBP+8) + 67 7e/jump-if-<= $factorial:end/disp8 + 68 # EBX = n-1 + 69 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX + 70 81 5/subop/subtract 3/mod/direct 3/rm32/EBX . . . . . 1/imm32 # subtract from EBX + 71 # EAX = factorial(n-1) + 72 # . . push args + 73 53/push-EBX + 74 # . . call + 75 e8/call factorial/disp32 + 76 # . . discard args + 77 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 78 # return n * factorial(n-1) + 79 f7 4/subop/multiply 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 8/disp8 . # multiply *(EBP+8) into EAX + 80 # TODO: check for overflow 81 $factorial:end: - 82 # epilog - 83 5b/pop-to-EBX - 84 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 85 5d/pop-to-EBP - 86 c3/return + 82 # . epilog + 83 5b/pop-to-EBX + 84 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP + 85 5d/pop-to-EBP + 86 c3/return 87 88 test-factorial: - 89 # factorial(5) - 90 # push args - 91 68/push 5/imm32 - 92 # call - 93 e8/call factorial/disp32 - 94 # discard args - 95 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - 96 # check-ints-equal(EAX, 120, failure message) - 97 # push args - 98 68/push "F - test-factorial"/imm32 - 99 68/push 0x78/imm32/expected-120 -100 50/push-EAX -101 # call -102 e8/call check-ints-equal/disp32 -103 # discard args -104 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -105 # end -106 c3/return + 89 # factorial(5) + 90 # . . push args + 91 68/push 5/imm32 + 92 # . . call + 93 e8/call factorial/disp32 + 94 # . . discard args + 95 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 96 # check-ints-equal(EAX, 120, failure message) + 97 # . . push args + 98 68/push "F - test-factorial"/imm32 + 99 68/push 0x78/imm32/expected-120 +100 50/push-EAX +101 # . . call +102 e8/call check-ints-equal/disp32 +103 # . . discard args +104 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +105 # end +106 c3/return 107 -108 # vim:nowrap:textwidth=0 +108 # . . vim:nowrap:textwidth=0 -- cgit 1.4.1-2-gfad0