From 3fe11fa0cb21a5b78b401e86ca9ca382332e8a6f Mon Sep 17 00:00:00 2001 From: pommicket Date: Sat, 13 Nov 2021 13:48:27 -0500 Subject: second pass (+hello world!), call A --- 03/ex03 | 39 +++++++++++++++++ 03/in02 | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 03/in03 | 63 ++++++++++------------------ 3 files changed, 200 insertions(+), 48 deletions(-) create mode 100644 03/ex03 (limited to '03') diff --git a/03/ex03 b/03/ex03 new file mode 100644 index 0000000..e78c187 --- /dev/null +++ b/03/ex03 @@ -0,0 +1,39 @@ + +D]=d7 +D]=C +D^=C +D|=C +D&=C +~C +B|=A +8D=C +A=1B +B>=d33 +call :funciton +x4b +!:label +?JB:label +A=:label +x3c +;;;;;;;;;;;;;;;;;;;;;;;return +;;;;;;;;;;;;;;;;;;;;;;;*- +;;;;;;;;;;;;;;;;;;;;;;;/- +;;;;;;;;;;;;;;;;;;;;;;;*+ +;;;;;;;;;;;;;;;;;;;;;;;/+ +:funciton +call A diff --git a/03/in02 b/03/in02 index 5a0f113..fa30868 100644 --- a/03/in02 +++ b/03/in02 @@ -20,6 +20,7 @@ DA im ##2. sy +::2p where the second pass starts from // write ELF header im ##4. @@ -109,7 +110,11 @@ je im ##78. ascii 'x' je -:-x# literal byte +:-#b literal byte +im +##27. ascii ' +je +:-#b literal byte im ##31. ascii '1' je @@ -194,6 +199,20 @@ im ##1. je :-cl +im +--SY "sycall" +IA +im +--LI +JA +im +--s= +cl +BA +im +##1. +je +:-sy jm :-ex // handle += instruction @@ -1069,7 +1088,7 @@ BA lq BI je -:-bl bad label if we've reached the end +:-!l bad label if we've reached the end JR im --s= @@ -1219,7 +1238,7 @@ DA jm :-wr // literal byte -::x# +::#b im --LI BA @@ -1735,9 +1754,23 @@ jm :-wr ::S) SA -// handle "call :label" +// handle call :label / call A ::cl im +##5. add 5 to line pointer to get pointer to label name +BA +im +--LI ++B +BA +zA +lb +BAs +im +##41. +je +:-ca call a +im ##5. add 5 to line pointer to get pointer to label name BA im @@ -1747,6 +1780,8 @@ BA im --l@ cl +// intentional fallthrough +::ca // emit 'call rax' im --Cl instruction @@ -1761,6 +1796,35 @@ jm :-rl jump back to read next line ::Cl cl +// handle "syscall " +::sy +im +##8. +BA +im +--LI ++B add 8 to line pointer to get pointer to number +BA +im +--nu +cl get syscall number +BA +im +--im +cl write 'mov rax, ' +im +--Sy +IA +im +##2. +DA +im +--wr +cl write 'syscall' +jm +:-rl next line +::Sy +sy // write to output file from rsi..rsi+rdx ::wr im @@ -1820,8 +1884,32 @@ im ##78. ascii 'x' je :-#x hexadecimal +im +##27. ascii ' +je +:-#' ascii character jm :-!n unrecognized number base +// convert character pointed to by rsi to character code in rax +::#' +// make sure there's no trailing characters +im +##1. +BI ++B +BA +zA +lb +BA +im +##a. +jn +:-!n +// okay, no trailing characters, just set rax = *rsi +BI +zA +lb +re // convert newline-terminated decimal representation in rsi to number in rax ::#d zA @@ -1982,10 +2070,45 @@ jm :-ex // end of file ::ef -// TODO: second pass -zA exit code 0 +im +--2P +BA +zA +lb +DA +// set 2P to 1 no matter what +im +##1. +sb +BD +zA +jn if 2nd pass is not zero, +:-ex exit +// okay we need to do the second pass. +// rewind file descriptors +// input +im +##3. +JA +zA +IA +DA +im +##8. lseek +sy +// output +im +##4. +JA +zA +IA +DA +im +##8. lseek +sy +// now go back to do the second pass jm -:-ex +:-2p ::2P second pass? 00 ::CL "call" text @@ -1994,6 +2117,15 @@ jm 'l 'l 20 +::SY "syscall" text +'s +'y +'s +'c +'a +'l +'l +20 ::IF input file name 'i 'n diff --git a/03/in03 b/03/in03 index 6d66bf5..88843a6 100644 --- a/03/in03 +++ b/03/in03 @@ -1,43 +1,24 @@ - -D]=d7 -e - -D]=C -D^=C -D|=C -D&=C -~C -B|=A -8D=C -e -A=1B -B>=d33 -e -call :funciton -x4b -!:label -?JB:label -A=:label -x3c -return --* --/ -+* -+/ +:hello_world +'H +'e +'l +'l +'o +', +x20 +'w +'o +'r +'l +'d +'! +xa +:hello_world_end -- cgit v1.2.3