summaryrefslogtreecommitdiff
path: root/crenshaw
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-08-12 08:18:59 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-08-12 08:18:59 +0200
commit8a4cfc2e63cc21328dbffd11d1a0455d806d48ef (patch)
treee1d920a76f0be9c68856f123d5f0927215e42213 /crenshaw
parent5eafed8deddd17392cdf6ca1a6d304b24fa1cba8 (diff)
downloadcompilertests-8a4cfc2e63cc21328dbffd11d1a0455d806d48ef.tar.gz
compilertests-8a4cfc2e63cc21328dbffd11d1a0455d806d48ef.tar.bz2
crenshaw: added brakets
Diffstat (limited to 'crenshaw')
-rw-r--r--crenshaw/README15
-rwxr-xr-xcrenshaw/build.sh7
-rw-r--r--crenshaw/main.pas21
-rw-r--r--crenshaw/test.prog2
4 files changed, 27 insertions, 18 deletions
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