diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-16 09:39:51 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-16 09:39:51 +0200 |
commit | 43f86cfdefd629426c0c3bc203ec715d47fb7a15 (patch) | |
tree | dd4a0c0c02558fd17067523475b064fc4f3dafe2 /crenshaw | |
parent | 35ad67c69732d9cc450492100dee52eab20c9748 (diff) | |
download | compilertests-43f86cfdefd629426c0c3bc203ec715d47fb7a15.tar.gz compilertests-43f86cfdefd629426c0c3bc203ec715d47fb7a15.tar.bz2 |
crenshaw: dynamic section of variables
Diffstat (limited to 'crenshaw')
-rw-r--r-- | crenshaw/main.pas | 43 | ||||
-rw-r--r-- | crenshaw/test.prog | 2 |
2 files changed, 41 insertions, 4 deletions
diff --git a/crenshaw/main.pas b/crenshaw/main.pas index 3e9e0a4..55189a7 100644 --- a/crenshaw/main.pas +++ b/crenshaw/main.pas @@ -79,14 +79,39 @@ end; procedure Expression; Forward; +var + nof_names : integer; + names : array[0..26] of char; + +procedure RememberName(name : char); +var + i : integer; + found : boolean; +begin + found := false; + for i := 0 to nof_names do begin + if names[i] = name then + found := true; + end; + if i = 26 then Abort('Table of variable names overflowed'); + if not found then begin + names[nof_names] := name; + inc(nof_names); + end; +end; + procedure Factor; +var name : char; begin if Look = '(' then begin Match('('); Expression; Match(')'); - end - else + end else if IsAlpha(Look) then begin + name := GetName; + RememberName(name); + EmitLn('mov eax, [' + name + ']'); + end else EmitLn('mov eax, ' + GetNum); end; @@ -126,7 +151,7 @@ begin; Match('+'); Term; Emitln('pop ebx'); - EmitLn('add eax, ebx'); + EmitLn('add eax,ebx'); end; procedure Subtract; @@ -157,12 +182,14 @@ end; procedure Init; begin + nof_names := 0; GetChar; end; procedure Prologue; begin WriteLn('[bits 32]'); + WriteLn('cpu 486'); WriteLn('org 0x1000000'); { WriteLn('section .text'); WriteLn('global main'); @@ -172,9 +199,19 @@ begin } end; +procedure Variables; +var i : integer; +begin + for i := 0 to nof_names do begin + EmitLabel(names[i]); + EmitLn('dw 0'); + end; +end; + procedure Epilogue; begin EmitLn('hlt'); + Variables; { EmitLn('leave'); EmitLn('ret'); diff --git a/crenshaw/test.prog b/crenshaw/test.prog index c208a59..339791d 100644 --- a/crenshaw/test.prog +++ b/crenshaw/test.prog @@ -1 +1 @@ -(4+4)*3/2-3 +(4+4)*3/2-3+a-b |