diff options
-rw-r--r-- | crenshaw/README | 3 | ||||
-rw-r--r-- | crenshaw/main.pas | 20 | ||||
-rw-r--r-- | crenshaw/test.prog | 2 |
3 files changed, 18 insertions, 7 deletions
diff --git a/crenshaw/README b/crenshaw/README index 0d1e58d..7bad3b5 100644 --- a/crenshaw/README +++ b/crenshaw/README @@ -1,7 +1,8 @@ fpc main.pas ./main < test.prog > test.asm nasm -f elf32 test.asm -gcc -m32 -o test test.o +gcc -m32 -march=i486 -ffreestanding -o test test.o +objcopy -O binary --only-section=.text test test.bin ndisasm -b32 test.bin ./test diff --git a/crenshaw/main.pas b/crenshaw/main.pas index eff412c..677c496 100644 --- a/crenshaw/main.pas +++ b/crenshaw/main.pas @@ -75,30 +75,40 @@ end; procedure Term; begin EmitLn('mov eax, ' + GetNum); + EmitLn('push eax'); end; procedure Add; begin; Match('+'); Term; + Emitln('pop eax'); + EmitLn('pop ebx'); EmitLn('add eax, ebx'); + EmitLn('push eax'); end; procedure Subtract; begin; Match('-'); Term; + EmitLn('pop eax'); + EmitLn('pop ebx'); EmitLn('sub eax, ebx'); + EmitLn('neg eax'); + EmitLn('push eax'); end; procedure Expression; begin Term; - EmitLn('mov ebx, eax'); - case Look of - '+': Add; - '-': Subtract; - else Expected('+/-'); + while Look in ['+', '-'] do + begin + case Look of + '+': Add; + '-': Subtract; + else Expected('+/-'); + end; end; end; diff --git a/crenshaw/test.prog b/crenshaw/test.prog index d6c68c4..a490d4b 100644 --- a/crenshaw/test.prog +++ b/crenshaw/test.prog @@ -1,2 +1,2 @@ -4+2 +4+2+5-8 |