diff options
author | Kartik Agaram <vc@akkartik.com> | 2018-11-30 11:10:44 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2018-11-30 11:13:36 -0800 |
commit | ee9a9237d6324f1de1bb7150083eacf7b9af5f70 (patch) | |
tree | 86180456f2a3cf5503783afc78856280f088a863 /subx/apps | |
parent | 6030d7e2e56d445ca67c6a0e8c9cf33e46bc673c (diff) | |
download | mu-ee9a9237d6324f1de1bb7150083eacf7b9af5f70.tar.gz |
4802
Some automated commenting cleanup. Still needs more careful manual scanning. sed -i 's/^# 1-3/# . 1-3/' *.subx */*.subx sed -i 's/^# op/# . op/' *.subx */*.subx sed -i 's/# vim/# . . vim/' *.subx */*.subx sed -i 's/^ # push args/ # . . push args/' *.subx */*.subx sed -i 's/^ # discard args/ # . . discard args/' *.subx */*.subx sed -i 's/^ # call/ # . . call/' *.subx */*.subx sed -i 's/^ # prolog/ # . prolog/' *.subx */*.subx sed -i 's/^ # epilog/ # . epilog/' *.subx */*.subx sed -i 's/^ # save registers/ # . save registers/' *.subx */*.subx sed -i 's/^ # restore registers/ # . restore registers/' *.subx */*.subx sed -i 's/ operand / register /' *.subx */*.subx
Diffstat (limited to 'subx/apps')
-rw-r--r-- | subx/apps/crenshaw2-1.subx | 58 | ||||
-rw-r--r-- | subx/apps/crenshaw2-1b.subx | 420 | ||||
-rw-r--r-- | subx/apps/factorial.subx | 44 |
3 files changed, 261 insertions, 261 deletions
diff --git a/subx/apps/crenshaw2-1.subx b/subx/apps/crenshaw2-1.subx index 94fd8efa..35966a22 100644 --- a/subx/apps/crenshaw2-1.subx +++ b/subx/apps/crenshaw2-1.subx @@ -26,12 +26,12 @@ # naming conventions. == 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 register 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: run tests if necessary, call 'compile' if not - # prolog + # . prolog 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # if (argc > 1) 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP @@ -77,10 +77,10 @@ $main:end: # the main entry point compile: # in : fd or (address stream), out : fd or (address stream), err : fd or (address stream), ed : (address exit-descriptor) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - # save registers + # . save registers 50/push-EAX 51/push-ECX # Look = get-char(in) @@ -179,10 +179,10 @@ compile: # in : fd or (address stream), out : fd or (address stream), err : fd e8/call write/disp32 # . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # restore registers + # . restore registers 59/pop-to-ECX 58/pop-to-EAX - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return @@ -211,7 +211,7 @@ get-num: # in : (address buffered-file), out : (address stream), err : fd or (a # get-char in each iteration of the loop. (Thereby demonstrating that it's # not the right interface for us. But we'll keep it just to follow Crenshaw.) # - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # EAX = is-digit?(Look) @@ -225,16 +225,16 @@ get-num: # in : (address buffered-file), out : (address stream), err : fd or (a 3d/compare-EAX 0/imm32 75/jump-if-not-equal $get-num:main/disp8 # . expected(ed, err, "integer") - # push args + # . . push args 68/push "integer"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - # call + # . . call e8/call expected/disp32 # never returns - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP $get-num:main: - # save registers + # . save registers 50/push-EAX 51/push-ECX 52/push-EDX @@ -254,13 +254,13 @@ $get-num:main: 3b/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare EDX with ECX 7d/jump-if-lesser $get-num:stage2/disp8 # error(ed, err, "get-num: too many digits in number") # TODO: show full number - # . push args + # . push args 68/push "get-num: too many digits in number"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - # . call + # . call e8/call error/disp32 # never returns - # . discard args + # . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP $get-num:stage2: # out->data[out->write] = LSB(Look) @@ -279,14 +279,14 @@ $get-num:stage2: $get-num:loop-end: # persist necessary variables from registers 89/copy 0/mod/indirect 7/rm32/EDI . . . 1/r32/ECX . . # copy ECX to *EDI - # restore registers + # . restore registers 5f/pop-to-EDI 5e/pop-to-ESI 5b/pop-to-EBX 5a/pop-to-EDX 59/pop-to-ECX 58/pop-to-EAX - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return @@ -475,7 +475,7 @@ test-get-num-aborts-on-non-digit-in-Look: # write(f, "Error: "+s+" expected\n") then stop(ed, 1) expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # write(f, "Error: ") @@ -517,14 +517,14 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # . call e8/call stop/disp32 ## should never get past this point - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return # write(f, "Error: "+s+"\n") then stop(ed, 1) error: # ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # write(f, "Error: ") @@ -558,17 +558,17 @@ error: # ed : (address exit-descriptor), f : fd or (address stream), s : (addre # . call e8/call stop/disp32 ## should never get past this point - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return # read a byte from 'f', and store it in 'Look' get-char: # f : (address buffered-file) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - # save registers + # . save registers 50/push-EAX # read-byte(f) # . push args @@ -579,15 +579,15 @@ get-char: # f : (address buffered-file) -> <void> 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # save EAX to Look 89/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Look/disp32 . # copy EAX to *Look - # restore registers + # . restore registers 58/pop-to-EAX - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return is-digit?: # c : int -> bool/EAX - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # EAX = false @@ -601,7 +601,7 @@ is-digit?: # c : int -> bool/EAX # otherwise return true b8/copy-to-EAX 1/imm32 $is-digit?:end: - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return @@ -631,4 +631,4 @@ _test-error-stream: # data 00 00 00 00 00 00 00 00 # 8 bytes -# vim:nowrap:textwidth=0 +# . . vim:nowrap:textwidth=0 diff --git a/subx/apps/crenshaw2-1b.subx b/subx/apps/crenshaw2-1b.subx index 2df45308..49436370 100644 --- a/subx/apps/crenshaw2-1b.subx +++ b/subx/apps/crenshaw2-1b.subx @@ -26,23 +26,23 @@ # naming conventions. == 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 register 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: run tests if necessary, call 'compile' if not - # prolog + # . prolog 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # if (argc > 1) 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP 7e/jump-if-lesser-or-equal $run-main/disp8 # and if (argv[1] == "test") - # push args + # . . push args 68/push "test"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) - # call + # . . call e8/call kernel-string-equal/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # check result 3d/compare-EAX 1/imm32 @@ -60,14 +60,14 @@ $run-main: # clear ed->target (so we really exit) c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX # compile(Stdin, 1/stdout, 2/stderr, ed) - # push args + # . . push args 50/push-EAX/ed 68/push 2/imm32/stderr 68/push 1/imm32/stdout 68/push Stdin/imm32 - # call + # . . call e8/call compile/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP # syscall(exit, 0) bb/copy-to-EBX 0/imm32 @@ -77,18 +77,18 @@ $main:end: # the main entry point compile: # in : fd or (address stream), out : fd or (address stream), err : fd or (address stream), ed : (address exit-descriptor) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - # save registers + # . save registers 50/push-EAX 51/push-ECX # Look = get-char(in) - # push args + # . . push args ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) - # call + # . . call e8/call get-char/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # var num/ECX : (address stream) on the stack # Numbers can be 32 bits or 8 hex bytes long. One of them will be in 'Look', so we need space for 7 bytes. @@ -99,90 +99,90 @@ compile: # in : fd or (address stream), out : fd or (address stream), err : fd # num->length = 7 c7/copy 1/mod/*+disp8 1/rm32/ECX . . . . 8/disp8 7/imm32 # copy to *(ECX+8) # clear-stream(num) - # push args + # . . push args 51/push-ECX - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # get-num(in, num, err, ed) - # push args + # . . push args ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) 51/push-ECX/num ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) - # call + # . . call e8/call get-num/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP # EAX = write(_test-stream, "Ab") - # push args + # . . push args 68/push "Ab"/imm32 68/push _test-stream/imm32 - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # EAX = write(out, "bb/copy-to-EBX ") - # push args + # . . push args 68/push "bb/copy-to-EBX "/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write-stream(out, num) - # push args + # . . push args 51/push-ECX/num ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(out, Newline) - # push args + # . . push args 68/push Newline/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # EAX = write(out, "b8/copy-to-EAX 1/imm32/exit") - # push args + # . . push args 68/push "b8/copy-to-EAX 1/imm32/exit"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # EAX = write(out, Newline) - # push args + # . . push args 68/push Newline/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # EAX = write(out, "cd/syscall 0x80/imm8") - # push args + # . . push args 68/push "cd/syscall 0x80/imm8"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # EAX = write(out, Newline) - # push args + # . . push args 68/push Newline/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # restore registers + # . restore registers 59/pop-to-ECX 58/pop-to-EAX - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return @@ -216,30 +216,30 @@ get-num: # in : (address buffered-file), out : (address stream), err : fd or (a # get-char in each iteration of the loop. (Thereby demonstrating that it's # not the right interface for us. But we'll keep it just to follow Crenshaw.) # - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # EAX = is-digit?(Look) - # push args + # . . push args ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Look/disp32 . # push *Look - # call + # . . call e8/call is-digit?/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # if EAX == 0 error 3d/compare-EAX 0/imm32 75/jump-if-not-equal $get-num:main/disp8 # expected(ed, err, "integer") - # push args + # . . push args 68/push "integer"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - # call + # . . call e8/call expected/disp32 # never returns - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP $get-num:main: - # save registers + # . save registers 50/push-EAX 51/push-ECX 52/push-EDX @@ -260,13 +260,13 @@ $get-num:loop: 3b/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare EDX with ECX 7d/jump-if-lesser $get-num:loop-stage2/disp8 # error(ed, err, "get-num: too many digits in number") # TODO: show full number - # push args + # . . push args 68/push "get-num: too many digits in number"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - # call + # . . call e8/call error/disp32 # never returns - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP $get-num:loop-stage2: # out->data[out->write] = LSB(Look) @@ -276,18 +276,18 @@ $get-num:loop-stage2: # ++out->write 41/increment-ECX # Look = get-char(in) - # push args + # . . push args 56/push-ESI - # call + # . . call e8/call get-char/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # EAX = is-digit?(Look) - # push args + # . . push args ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Look/disp32 . # push *Look - # call + # . . call e8/call is-digit?/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # if EAX loop 3d/compare-EAX 0/imm32 @@ -295,14 +295,14 @@ $get-num:loop-stage2: $get-num:loop-end: # persist necessary variables from registers 89/copy 0/mod/indirect 7/rm32/EDI . . . 1/r32/ECX . . # copy ECX to *EDI - # restore registers + # . restore registers 5f/pop-to-EDI 5e/pop-to-ESI 5b/pop-to-EBX 5a/pop-to-EDX 59/pop-to-ECX 58/pop-to-EAX - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return @@ -314,43 +314,43 @@ test-get-num-reads-single-digit: 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP ## clear all streams # clear-stream(_test-stream) - # push args + # . . push args 68/push _test-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-buffered-file+4) - # push args + # . . push args b8/copy-to-EAX _test-buffered-file/imm32 05/add-to-EAX 4/imm32 50/push-EAX - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-output-stream) - # push args + # . . push args 68/push _test-output-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-error-stream) - # push args + # . . push args 68/push _test-error-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP ## initialize 'in' # write(_test-stream, "3") - # push args + # . . push args 68/push "3"/imm32 68/push _test-stream/imm32 - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## initialize exit-descriptor 'ed' # allocate on stack @@ -359,41 +359,41 @@ test-get-num-reads-single-digit: 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . . # copy ESP to EAX # size the exit-descriptor for the call to get-num below # tailor-exit-descriptor(ed, 16) - # push args + # . . push args 68/push 0x10/imm32/nbytes-of-args-for-get-num 50/push-EAX/ed - # call + # . . call e8/call tailor-exit-descriptor/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## prime the pump # get-char(_test-buffered-file) - # push args + # . . push args 68/push _test-buffered-file/imm32 - # call + # . . call e8/call get-char/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP ## get-num(in, out, err, ed) - # push args + # . . push args 50/push-EAX/ed 68/push _test-error-stream/imm32 68/push _test-output-stream/imm32 68/push _test-buffered-file/imm32 - # call + # . . call e8/call get-num/disp32 ## registers except ESP may be clobbered at this point - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP # check-ints-equal(*_test-output-stream.data, '3') - # push args + # . . push args 68/push "F - test-get-num-reads-single-digit"/imm32 68/push 0x33/imm32 b8/copy-to-EAX _test-output-stream/imm32 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 . # push *(EAX+12) - # call + # . . call e8/call check-ints-equal/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # reclaim locals 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP @@ -407,43 +407,43 @@ test-get-num-aborts-on-non-digit-in-Look: 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP ## clear all streams # clear-stream(_test-stream) - # push args + # . . push args 68/push _test-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-buffered-file+4) - # push args + # . . push args b8/copy-to-EAX _test-buffered-file/imm32 05/add-to-EAX 4/imm32 50/push-EAX - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-output-stream) - # push args + # . . push args 68/push _test-output-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-error-stream) - # push args + # . . push args 68/push _test-error-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP ## initialize 'in' # write(_test-stream, "3") - # push args + # . . push args 68/push "3"/imm32 68/push _test-stream/imm32 - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## initialize exit-descriptor 'ed' # allocate on stack @@ -452,35 +452,35 @@ test-get-num-aborts-on-non-digit-in-Look: 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . . # copy ESP to EAX # size the exit-descriptor for the call to get-num below # tailor-exit-descriptor(ed, 16) - # push args + # . . push args 68/push 0x10/imm32/nbytes-of-args-for-get-num 50/push-EAX/ed - # call + # . . call e8/call tailor-exit-descriptor/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## don't initialize Look ## get-num(in, out, err, ed) - # push args + # . . push args 50/push-EAX/ed 68/push _test-error-stream/imm32 68/push _test-output-stream/imm32 68/push _test-buffered-file/imm32 - # call + # . . call e8/call get-num/disp32 ## registers except ESP may be clobbered at this point - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP ## check that get-num tried to call exit(1) # check-ints-equal(ed->value, 2, msg) # i.e. stop was called with value 1 - # push args + # . . push args 68/push "F - test-get-num-aborts-on-non-digit-in-Look"/imm32 68/push 2/imm32 # push ed->value ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) - # call + # . . call e8/call check-ints-equal/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # reclaim locals 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP @@ -494,43 +494,43 @@ test-get-num-reads-multiple-digits: 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP ## clear all streams # clear-stream(_test-stream) - # push args + # . . push args 68/push _test-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-buffered-file+4) - # push args + # . . push args b8/copy-to-EAX _test-buffered-file/imm32 05/add-to-EAX 4/imm32 50/push-EAX - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-output-stream) - # push args + # . . push args 68/push _test-output-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-error-stream) - # push args + # . . push args 68/push _test-error-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP ## initialize 'in' # write(_test-stream, "3456 x") - # push args + # . . push args 68/push "3456"/imm32 68/push _test-stream/imm32 - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## initialize exit-descriptor 'ed' # allocate on stack @@ -539,41 +539,41 @@ test-get-num-reads-multiple-digits: 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . . # copy ESP to EAX # size the exit-descriptor for the call to get-num below # tailor-exit-descriptor(ed, 16) - # push args + # . . push args 68/push 0x10/imm32/nbytes-of-args-for-get-num 50/push-EAX/ed - # call + # . . call e8/call tailor-exit-descriptor/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## prime the pump # get-char(_test-buffered-file) - # push args + # . . push args 68/push _test-buffered-file/imm32 - # call + # . . call e8/call get-char/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP ## get-num(in, out, err, ed) - # push args + # . . push args 50/push-EAX/ed 68/push _test-error-stream/imm32 68/push _test-output-stream/imm32 68/push _test-buffered-file/imm32 - # call + # . . call e8/call get-num/disp32 ## registers except ESP may be clobbered at this point - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP # check-ints-equal(*_test-output-stream.data, '3456') - # push args + # . . push args 68/push "F - test-get-num-reads-multiple-digits"/imm32 68/push 0x36353433/imm32 b8/copy-to-EAX _test-output-stream/imm32 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 . # push *(EAX+12) - # call + # . . call e8/call check-ints-equal/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # reclaim locals 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP @@ -587,43 +587,43 @@ test-get-num-reads-multiple-digits-followed-by-nondigit: 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP ## clear all streams # clear-stream(_test-stream) - # push args + # . . push args 68/push _test-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-buffered-file+4) - # push args + # . . push args b8/copy-to-EAX _test-buffered-file/imm32 05/add-to-EAX 4/imm32 50/push-EAX - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-output-stream) - # push args + # . . push args 68/push _test-output-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # clear-stream(_test-error-stream) - # push args + # . . push args 68/push _test-error-stream/imm32 - # call + # . . call e8/call clear-stream/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP ## initialize 'in' # write(_test-stream, "3456 x") - # push args + # . . push args 68/push "3456 x"/imm32 68/push _test-stream/imm32 - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## initialize exit-descriptor 'ed' # allocate on stack @@ -632,41 +632,41 @@ test-get-num-reads-multiple-digits-followed-by-nondigit: 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . . # copy ESP to EAX # size the exit-descriptor for the call to get-num below # tailor-exit-descriptor(ed, 16) - # push args + # . . push args 68/push 0x10/imm32/nbytes-of-args-for-get-num 50/push-EAX/ed - # call + # . . call e8/call tailor-exit-descriptor/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP ## prime the pump # get-char(_test-buffered-file) - # push args + # . . push args 68/push _test-buffered-file/imm32 - # call + # . . call e8/call get-char/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP ## get-num(in, out, err, ed) - # push args + # . . push args 50/push-EAX/ed 68/push _test-error-stream/imm32 68/push _test-output-stream/imm32 68/push _test-buffered-file/imm32 - # call + # . . call e8/call get-num/disp32 ## registers except ESP may be clobbered at this point - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP # check-ints-equal(*_test-output-stream.data, '3456') - # push args + # . . push args 68/push "F - test-get-num-reads-multiple-digits-followed-by-nondigit"/imm32 68/push 0x36353433/imm32 b8/copy-to-EAX _test-output-stream/imm32 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 . # push *(EAX+12) - # call + # . . call e8/call check-ints-equal/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # reclaim locals 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP @@ -677,119 +677,119 @@ test-get-num-reads-multiple-digits-followed-by-nondigit: # write(f, "Error: "+s+" expected\n") then stop(ed, 1) expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # write(f, "Error: ") - # push args + # . . push args 68/push "Error: "/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(f, s) - # push args + # . . push args ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(f, " expected") - # push args + # . . push args 68/push " expected"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(f, Newline) - # push args + # . . push args 68/push Newline/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # stop(ed, 1) - # push args + # . . push args 68/push 1/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) - # call + # . . call e8/call stop/disp32 ## should never get past this point - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return # write(f, "Error: "+s+"\n") then stop(ed, 1) error: # ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # write(f, "Error: ") - # push args + # . . push args 68/push "Error: "/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(f, s) - # push args + # . . push args ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(f, Newline) - # push args + # . . push args 68/push Newline/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - # call + # . . call e8/call write/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # stop(ed, 1) - # push args + # . . push args 68/push 1/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) - # call + # . . call e8/call stop/disp32 ## should never get past this point - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return # read a byte from 'f', and store it in 'Look' get-char: # f : (address buffered-file) -> <void> - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - # save registers + # . save registers 50/push-EAX # read-byte(f) - # push args + # . . push args ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) - # call + # . . call e8/call read-byte/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # save EAX to Look 89/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Look/disp32 . # copy EAX to *Look - # restore registers + # . restore registers 58/pop-to-EAX - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return is-digit?: # c : int -> bool/EAX - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # EAX = false @@ -803,7 +803,7 @@ is-digit?: # c : int -> bool/EAX # otherwise return true b8/copy-to-EAX 1/imm32 $is-digit?:end: - # epilog + # . epilog 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP c3/return @@ -833,4 +833,4 @@ _test-error-stream: # data 00 00 00 00 00 00 00 00 # 8 bytes -# vim:nowrap:textwidth=0 +# . . vim:nowrap:textwidth=0 diff --git a/subx/apps/factorial.subx b/subx/apps/factorial.subx index 1e0191d1..f7675962 100644 --- a/subx/apps/factorial.subx +++ b/subx/apps/factorial.subx @@ -15,23 +15,23 @@ # When running tests the exit status doesn't mean anything. Yet. == 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 register 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: - # prolog + # . prolog 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # if (argc > 1) 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP 7e/jump-if-lesser-or-equal $run-main/disp8 # and if (argv[1] == "test") - # push args + # . . push args 68/push "test"/imm32 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) - # call + # . . call e8/call kernel-string-equal/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # check result 3d/compare-EAX 1/imm32 @@ -42,11 +42,11 @@ eb/jump $main:end/disp8 # where EAX will get copied to EBX # else EAX = factorial(5) $run-main: - # push args + # . . push args 68/push 5/imm32 - # call + # . . call e8/call factorial/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP $main:end: # exit(EAX) @@ -56,7 +56,7 @@ $main:end: # factorial(n) factorial: - # prolog + # . prolog 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP 53/push-EBX @@ -69,17 +69,17 @@ factorial: 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX 81 5/subop/subtract 3/mod/direct 3/rm32/EBX . . . . . 1/imm32 # subtract from EBX # EAX = factorial(n-1) - # push args + # . . push args 53/push-EBX - # call + # . . call e8/call factorial/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # return n * factorial(n-1) f7 4/subop/multiply 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 8/disp8 . # multiply *(EBP+8) into EAX # TODO: check for overflow $factorial:end: - # epilog + # . epilog 5b/pop-to-EBX 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 5d/pop-to-EBP @@ -87,22 +87,22 @@ $factorial:end: test-factorial: # factorial(5) - # push args + # . . push args 68/push 5/imm32 - # call + # . . call e8/call factorial/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # check-ints-equal(EAX, 120, failure message) - # push args + # . . push args 68/push "F - test-factorial"/imm32 68/push 0x78/imm32/expected-120 50/push-EAX - # call + # . . call e8/call check-ints-equal/disp32 - # discard args + # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # end c3/return -# vim:nowrap:textwidth=0 +# . . vim:nowrap:textwidth=0 |