From 8a4cfc2e63cc21328dbffd11d1a0455d806d48ef Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 12 Aug 2018 08:18:59 +0200 Subject: crenshaw: added brakets --- crenshaw/README | 15 ++++++++------- crenshaw/build.sh | 7 +++++++ crenshaw/main.pas | 21 +++++++++++---------- crenshaw/test.prog | 2 +- 4 files changed, 27 insertions(+), 18 deletions(-) create mode 100755 crenshaw/build.sh (limited to 'crenshaw') diff --git a/crenshaw/README b/crenshaw/README index 7bad3b5..f95033f 100644 --- a/crenshaw/README +++ b/crenshaw/README @@ -1,14 +1,15 @@ -fpc main.pas -./main < test.prog > test.asm -nasm -f elf32 test.asm -gcc -m32 -march=i486 -ffreestanding -o test test.o -objcopy -O binary --only-section=.text test test.bin -ndisasm -b32 test.bin -./test +debugging #gdb ./test #(gdb) set disassemble-next-line on +#(gdb) display $eax +#(gdb) display $ebx #(gdb) start #(gdb) si #(gdb) info registers +links + +https://en.wikibooks.org/wiki/68000_Assembly +https://en.wikipedia.org/wiki/X86_instruction_listings +file:///media/sd/compilertests/doc/Intel 80x86 Assembly Language OpCodes.html#div diff --git a/crenshaw/build.sh b/crenshaw/build.sh new file mode 100755 index 0000000..5ef9938 --- /dev/null +++ b/crenshaw/build.sh @@ -0,0 +1,7 @@ +fpc main.pas +./main < test.prog > test.asm +nasm -f elf32 test.asm +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 12fec6e..04a3624 100644 --- a/crenshaw/main.pas +++ b/crenshaw/main.pas @@ -72,10 +72,17 @@ begin; WriteLn(s+':'); end; +procedure Expression; Forward; + procedure Factor; begin - EmitLn('mov eax, ' + GetNum); - EmitLn('push eax'); + if Look = '(' then begin + Match('('); + Expression; + Match(')'); + end + else + EmitLn('mov eax, ' + GetNum); end; procedure Multiply; @@ -83,9 +90,7 @@ begin Match('*'); Factor; EmitLn('pop ebx'); - EmitLn('pop eax'); EmitLn('mul ebx'); - EmitLn('push eax'); end; procedure Divide; @@ -93,9 +98,7 @@ begin Match('/'); Factor; EmitLn('pop ebx'); - EmitLn('pop eax'); EmitLn('div ebx'); - EmitLn('push eax'); end; procedure Term; @@ -103,6 +106,7 @@ begin Factor; while Look in ['*', '/'] do begin + EmitLn('push eax'); case Look of '*': Multiply; '/': Divide; @@ -116,9 +120,7 @@ begin; Match('+'); Term; Emitln('pop ebx'); - EmitLn('pop eax'); EmitLn('add eax, ebx'); - EmitLn('push eax'); end; procedure Subtract; @@ -126,9 +128,7 @@ begin; Match('-'); Term; EmitLn('pop ebx'); - EmitLn('pop eax'); EmitLn('sub eax, ebx'); - EmitLn('push eax'); end; procedure Expression; @@ -136,6 +136,7 @@ begin Term; while Look in ['+', '-'] do begin + EmitLn('push eax'); case Look of '+': Add; '-': Subtract; diff --git a/crenshaw/test.prog b/crenshaw/test.prog index 95b87fe..a1d75c4 100644 --- a/crenshaw/test.prog +++ b/crenshaw/test.prog @@ -1,2 +1,2 @@ -4+4*3/2-3 +(4+4)*3/2-3 -- cgit v1.2.3-54-g00ecf