diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-11 16:10:03 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-11 16:10:03 +0200 |
commit | 0300971e3bb7efa727c35ef54203a8ffe00eba9a (patch) | |
tree | d7633f8fae3b279209651f25dd00ab310a26b635 /crenshaw | |
parent | 3f7d123bbcc1611b37e5e3ea5777177ed0ef0aa8 (diff) | |
download | compilertests-0300971e3bb7efa727c35ef54203a8ffe00eba9a.tar.gz compilertests-0300971e3bb7efa727c35ef54203a8ffe00eba9a.tar.bz2 |
a first tutorial2 expression output
Diffstat (limited to 'crenshaw')
-rw-r--r-- | crenshaw/README | 4 | ||||
-rw-r--r-- | crenshaw/main.pas | 51 | ||||
-rw-r--r-- | crenshaw/test.prog | 2 |
3 files changed, 56 insertions, 1 deletions
diff --git a/crenshaw/README b/crenshaw/README new file mode 100644 index 0000000..1047944 --- /dev/null +++ b/crenshaw/README @@ -0,0 +1,4 @@ +fpc main.pas +./main < test.prog > test.asm +nasm test.asm -f bin -o test.bin +ndisasm -b32 test.bin diff --git a/crenshaw/main.pas b/crenshaw/main.pas index 3adc53b..a5f42ae 100644 --- a/crenshaw/main.pas +++ b/crenshaw/main.pas @@ -63,9 +63,58 @@ end; procedure EmitLn(s : string); begin - WriteLn; Emit(s); + WriteLn; +end; + + +procedure Term; +begin + EmitLn('mov eax, ' + GetNum); +end; + +procedure Add; +begin; + Match('+'); + Term; + EmitLn('add eax, ebx'); +end; + +procedure Subtract; +begin; + Match('-'); + Term; + EmitLn('sub eax, ebx'); +end; + +procedure Expression; +begin + Term; + EmitLn('mov ebx, eax'); + case Look of + '+': Add; + '-': Subtract; + else Expected('+/-'); + end; +end; + +procedure Init; +begin + GetChar; +end; + +procedure Prologue; +begin + EmitLn('[bits 32]'); +end; + +procedure Epilogue; +begin end; begin + Prologue; + Init; + Expression; + Epilogue; end. diff --git a/crenshaw/test.prog b/crenshaw/test.prog new file mode 100644 index 0000000..d6c68c4 --- /dev/null +++ b/crenshaw/test.prog @@ -0,0 +1,2 @@ +4+2 + |