diff options
author | Kartik Agaram <vc@akkartik.com> | 2018-11-30 10:54:42 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2018-11-30 10:54:42 -0800 |
commit | 6030d7e2e56d445ca67c6a0e8c9cf33e46bc673c (patch) | |
tree | 83b6fc800dc5c90295b58e5b0494b083636efbaa /subx/052kernel_string_equal.subx | |
parent | e9661581f092f3e210b7bd900af058d8b8c4369e (diff) | |
download | mu-6030d7e2e56d445ca67c6a0e8c9cf33e46bc673c.tar.gz |
4801
Reindent all SubX code to make some room for the new comment style.
Diffstat (limited to 'subx/052kernel_string_equal.subx')
-rw-r--r-- | subx/052kernel_string_equal.subx | 324 |
1 files changed, 162 insertions, 162 deletions
diff --git a/subx/052kernel_string_equal.subx b/subx/052kernel_string_equal.subx index 341607b5..3eb0158c 100644 --- a/subx/052kernel_string_equal.subx +++ b/subx/052kernel_string_equal.subx @@ -15,247 +15,247 @@ # would cause tests to not run, rather than to fail as we'd like.) == code -# instruction effective address operand displacement immediate -# op subop mod rm32 base index scale r32 -# 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 +# instruction effective address operand displacement immediate +# op subop mod rm32 base index scale r32 +# 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 # main: - e8/call run-tests/disp32 # 'run-tests' is a function created automatically by SubX. It calls all functions that start with 'test-'. - # exit(Num-test-failures) - 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX - b8/copy-to-EAX 1/imm32 - cd/syscall 0x80/imm8 + e8/call run-tests/disp32 # 'run-tests' is a function created automatically by SubX. It calls all functions that start with 'test-'. + # exit(Num-test-failures) + 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX + b8/copy-to-EAX 1/imm32 + cd/syscall 0x80/imm8 # compare a null-terminated ascii string with a more idiomatic length-prefixed byte array # reason for the name: the only place we should have null-terminated ascii strings is from commandline args kernel-string-equal: # s : null-terminated ascii string, benchmark : length-prefixed ascii string -> EAX : boolean - # prolog - 55/push-EBP - 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - # save registers - 51/push-ECX - 52/push-EDX - 53/push-EBX - 56/push-ESI - 57/push-EDI + # prolog + 55/push-EBP + 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + # save registers + 51/push-ECX + 52/push-EDX + 53/push-EBX + 56/push-ESI + 57/push-EDI - # pseudocode: - # initialize n = b.length - # initialize s1 = s - # initialize s2 = b.data - # i = 0 - # for (i = 0; i < n; ++n) - # c1 = *s1 - # c2 = *s2 - # if c1 == 0 - # return false - # if c1 != c2 - # return false - # return *s1 == 0 - # - # initialize s into EDI - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI - # initialize benchmark length n into EDX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX - 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . . # copy *EDX to EDX - # initialize benchmark data into ESI - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI - 81 0/subop/add 3/mod/direct 6/rm32/ESI . . . . . 4/imm32 # add to ESI - # initialize loop counter i into ECX - b9/copy-to-ECX 0/imm32/exit - # while (i/ECX < n/EDX) + # pseudocode: + # initialize n = b.length + # initialize s1 = s + # initialize s2 = b.data + # i = 0 + # for (i = 0; i < n; ++n) + # c1 = *s1 + # c2 = *s2 + # if c1 == 0 + # return false + # if c1 != c2 + # return false + # return *s1 == 0 + # + # initialize s into EDI + 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + # initialize benchmark length n into EDX + 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX + 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . . # copy *EDX to EDX + # initialize benchmark data into ESI + 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI + 81 0/subop/add 3/mod/direct 6/rm32/ESI . . . . . 4/imm32 # add to ESI + # initialize loop counter i into ECX + b9/copy-to-ECX 0/imm32/exit + # while (i/ECX < n/EDX) $kernel-string-equal:loop: - 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX - 74/jump-if-equal $kernel-string-equal:break/disp8 + 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX + 74/jump-if-equal $kernel-string-equal:break/disp8 # c1/EAX, c2/EBX = *s, *benchmark - b8/copy-to-EAX 0/imm32 - 8a/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . . # copy byte at *EDI to lower byte of EAX - bb/copy-to-EBX 0/imm32 - 8a/copy 0/mod/indirect 6/rm32/ESI . . . 3/r32/EBX . . # copy byte at *ESI to lower byte of EBX + b8/copy-to-EAX 0/imm32 + 8a/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . . # copy byte at *EDI to lower byte of EAX + bb/copy-to-EBX 0/imm32 + 8a/copy 0/mod/indirect 6/rm32/ESI . . . 3/r32/EBX . . # copy byte at *ESI to lower byte of EBX # if (c1 == 0) return false - 3d/compare-EAX 0/imm32 - 74/jump-if-equal $kernel-string-equal:false/disp8 + 3d/compare-EAX 0/imm32 + 74/jump-if-equal $kernel-string-equal:false/disp8 # if (c1 != c2) return false - 39/compare 3/mod/direct 0/rm32/EAX . . . 3/r32/EBX . . # compare EAX with EBX - 75/jump-if-not-equal $kernel-string-equal:false/disp8 + 39/compare 3/mod/direct 0/rm32/EAX . . . 3/r32/EBX . . # compare EAX with EBX + 75/jump-if-not-equal $kernel-string-equal:false/disp8 # ++s1, ++s2, ++i - 41/inc-ECX - 46/inc-ESI - 47/inc-EDI - # end while - eb/jump $kernel-string-equal:loop/disp8 + 41/inc-ECX + 46/inc-ESI + 47/inc-EDI + # end while + eb/jump $kernel-string-equal:loop/disp8 $kernel-string-equal:break: - # if (*s/EDI == 0) return true - b8/copy-to-EAX 0/imm32 - 8a/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . . # copy byte at *EDI to lower byte of EAX - 3d/compare-EAX 0/imm32 - 75/jump-if-not-equal $kernel-string-equal:false/disp8 + # if (*s/EDI == 0) return true + b8/copy-to-EAX 0/imm32 + 8a/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . . # copy byte at *EDI to lower byte of EAX + 3d/compare-EAX 0/imm32 + 75/jump-if-not-equal $kernel-string-equal:false/disp8 $kernel-string-equal:true: - b8/copy-to-EAX 1/imm32 - eb/jump $kernel-string-equal:end/disp8 - # return false + b8/copy-to-EAX 1/imm32 + eb/jump $kernel-string-equal:end/disp8 + # return false $kernel-string-equal:false: - b8/copy-to-EAX 0/imm32 + b8/copy-to-EAX 0/imm32 $kernel-string-equal:end: - # restore registers - 5f/pop-to-EDI - 5e/pop-to-ESI - 5b/pop-to-EBX - 5a/pop-to-EDX - 59/pop-to-ECX - # epilog - 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 5d/pop-to-EBP - c3/return + # restore registers + 5f/pop-to-EDI + 5e/pop-to-ESI + 5b/pop-to-EBX + 5a/pop-to-EDX + 59/pop-to-ECX + # epilog + 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP + 5d/pop-to-EBP + c3/return ## tests test-compare-null-kernel-string-with-empty-array: - # EAX = kernel-string-equal(Null-kernel-string, "") + # EAX = kernel-string-equal(Null-kernel-string, "") # push args - 68/push ""/imm32 - 68/push Null-kernel-string/imm32 + 68/push ""/imm32 + 68/push Null-kernel-string/imm32 # call - e8/call kernel-string-equal/disp32 + e8/call kernel-string-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # call check-ints-equal(EAX, 1, msg) + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # call check-ints-equal(EAX, 1, msg) # push args - 68/push "F - test-compare-null-kernel-string-with-empty-array"/imm32 - 68/push 1/imm32/true - 50/push-EAX + 68/push "F - test-compare-null-kernel-string-with-empty-array"/imm32 + 68/push 1/imm32/true + 50/push-EAX # call - e8/call check-ints-equal/disp32 + e8/call check-ints-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP - c3/return + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + c3/return test-compare-null-kernel-string-with-non-empty-array: - # EAX = kernel-string-equal(Null-kernel-string, "Abc") + # EAX = kernel-string-equal(Null-kernel-string, "Abc") # push args - 68/push "Abc"/imm32 - 68/push Null-kernel-string/imm32 + 68/push "Abc"/imm32 + 68/push Null-kernel-string/imm32 # call - e8/call kernel-string-equal/disp32 + e8/call kernel-string-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # call check-ints-equal(EAX, 0, msg) + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # call check-ints-equal(EAX, 0, msg) # push args - 68/push "F - test-compare-null-kernel-string-with-non-empty-array"/imm32 - 68/push 0/imm32/false - 50/push-EAX + 68/push "F - test-compare-null-kernel-string-with-non-empty-array"/imm32 + 68/push 0/imm32/false + 50/push-EAX # call - e8/call check-ints-equal/disp32 + e8/call check-ints-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP - c3/return + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + c3/return test-compare-kernel-string-with-equal-array: - # EAX = kernel-string-equal(Abc-kernel-string, "Abc") + # EAX = kernel-string-equal(Abc-kernel-string, "Abc") # push args - 68/push "Abc"/imm32 - 68/push Abc-kernel-string/imm32 + 68/push "Abc"/imm32 + 68/push Abc-kernel-string/imm32 # call - e8/call kernel-string-equal/disp32 + e8/call kernel-string-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # call check-ints-equal(EAX, 1, msg) + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # call check-ints-equal(EAX, 1, msg) # push args - 68/push "F - test-compare-kernel-string-with-equal-array"/imm32 - 68/push 1/imm32/true - 50/push-EAX + 68/push "F - test-compare-kernel-string-with-equal-array"/imm32 + 68/push 1/imm32/true + 50/push-EAX # call - e8/call check-ints-equal/disp32 + e8/call check-ints-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP - c3/return + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + c3/return test-compare-kernel-string-with-inequal-array: - # EAX = kernel-string-equal(Abc-kernel-string, "Adc") + # EAX = kernel-string-equal(Abc-kernel-string, "Adc") # push args - 68/push "Adc"/imm32 - 68/push Abc-kernel-string/imm32 + 68/push "Adc"/imm32 + 68/push Abc-kernel-string/imm32 # call - e8/call kernel-string-equal/disp32 + e8/call kernel-string-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # call check-ints-equal(EAX, 0, msg) + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # call check-ints-equal(EAX, 0, msg) # push args - 68/push "F - test-compare-kernel-string-with-equal-array"/imm32 - 68/push 0/imm32/false - 50/push-EAX + 68/push "F - test-compare-kernel-string-with-equal-array"/imm32 + 68/push 0/imm32/false + 50/push-EAX # call - e8/call check-ints-equal/disp32 + e8/call check-ints-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP - c3/return + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + c3/return test-compare-kernel-string-with-empty-array: - # EAX = kernel-string-equal(Abc-kernel-string, "") + # EAX = kernel-string-equal(Abc-kernel-string, "") # push args - 68/push ""/imm32 - 68/push Abc-kernel-string/imm32 + 68/push ""/imm32 + 68/push Abc-kernel-string/imm32 # call - e8/call kernel-string-equal/disp32 + e8/call kernel-string-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # call check-ints-equal(EAX, 0) + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # call check-ints-equal(EAX, 0) # push args - 68/push "F - test-compare-kernel-string-with-equal-array"/imm32 - 68/push 0/imm32/false - 50/push-EAX + 68/push "F - test-compare-kernel-string-with-equal-array"/imm32 + 68/push 0/imm32/false + 50/push-EAX # call - e8/call check-ints-equal/disp32 + e8/call check-ints-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP - c3/return + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + c3/return test-compare-kernel-string-with-shorter-array: - # EAX = kernel-string-equal(Abc-kernel-string, "Ab") + # EAX = kernel-string-equal(Abc-kernel-string, "Ab") # push args - 68/push "Ab"/imm32 - 68/push Abc-kernel-string/imm32 + 68/push "Ab"/imm32 + 68/push Abc-kernel-string/imm32 # call - e8/call kernel-string-equal/disp32 + e8/call kernel-string-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # call check-ints-equal(EAX, 0) + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # call check-ints-equal(EAX, 0) # push args - 68/push "F - test-compare-kernel-string-with-shorter-array"/imm32 - 68/push 0/imm32/false - 50/push-EAX + 68/push "F - test-compare-kernel-string-with-shorter-array"/imm32 + 68/push 0/imm32/false + 50/push-EAX # call - e8/call check-ints-equal/disp32 + e8/call check-ints-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP - c3/return + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + c3/return test-compare-kernel-string-with-longer-array: - # EAX = kernel-string-equal(Abc-kernel-string, "Abcd") + # EAX = kernel-string-equal(Abc-kernel-string, "Abcd") # push args - 68/push "Abcd"/imm32 - 68/push Abc-kernel-string/imm32 + 68/push "Abcd"/imm32 + 68/push Abc-kernel-string/imm32 # call - e8/call kernel-string-equal/disp32 + e8/call kernel-string-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # call check-ints-equal(EAX, 0) + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # call check-ints-equal(EAX, 0) # push args - 68/push "F - test-compare-kernel-string-with-longer-array"/imm32 - 68/push 0/imm32/false - 50/push-EAX + 68/push "F - test-compare-kernel-string-with-longer-array"/imm32 + 68/push 0/imm32/false + 50/push-EAX # call - e8/call check-ints-equal/disp32 + e8/call check-ints-equal/disp32 # discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP - c3/return + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + c3/return == data Null-kernel-string: - 00/null + 00/null Abc-kernel-string: - 41/A 62/b 63/c 00/null + 41/A 62/b 63/c 00/null # vim:nowrap:textwidth=0 |