+ partial support for BP7 reference-like inline asm constants

git-svn-id: trunk@38850 -
This commit is contained in:
nickysn 2018-04-26 14:31:13 +00:00
parent d1fc31de94
commit 16e0172021
3 changed files with 53 additions and 2 deletions

1
.gitattributes vendored
View File

@ -12578,6 +12578,7 @@ tests/test/tasm25ss1.pp svneol=native#text/plain
tests/test/tasm25ss2.pp svneol=native#text/plain
tests/test/tasm25ss3.pp svneol=native#text/plain
tests/test/tasm26.pp svneol=native#text/plain
tests/test/tasm27.pp svneol=native#text/plain
tests/test/tasm2a.pp svneol=native#text/plain
tests/test/tasm3.pp svneol=native#text/plain
tests/test/tasm4.pp svneol=native#text/plain

View File

@ -52,7 +52,11 @@ Unit Rax86int;
tconstsymbolexpressioninputflag = (
cseif_needofs,
cseif_isref,
cseif_startingminus
cseif_startingminus,
{ allows using full reference-like syntax for constsymbol expressions,
for example:
Rec.Str[5] -> Rec.Str+5 }
cseif_referencelike
);
tconstsymbolexpressioninputflags = set of tconstsymbolexpressioninputflag;
{ output flags for BuildConstSymbolExpression }
@ -1063,6 +1067,23 @@ Unit Rax86int;
{ Support ugly delphi constructs like: [ECX].1+2[EDX] }
if (cseif_isref in in_flags) and (actasmtoken=AS_LBRACKET) then
break;
if (cseif_referencelike in in_flags) and
(actasmtoken in [AS_LBRACKET,AS_RBRACKET]) then
case actasmtoken of
AS_LBRACKET:
begin
Consume(AS_LBRACKET);
if (length(expr)>0) and
not (expr[length(expr)] in ['+','-']) then
expr:=expr+'+';
expr:=expr+'[';
end;
AS_RBRACKET:
begin
Consume(AS_RBRACKET);
expr:=expr+']';
end;
end;
Case actasmtoken of
AS_LPAREN:
Begin
@ -2760,7 +2781,7 @@ Unit Rax86int;
{$endif i8086}
AS_ID :
Begin
BuildConstSymbolExpression([],value,asmsym,asmsymtyp,size,cse_out_flags);
BuildConstSymbolExpression([cseif_referencelike],value,asmsym,asmsymtyp,size,cse_out_flags);
if asmsym<>'' then
begin
if not (cseof_isseg in cse_out_flags) and

29
tests/test/tasm27.pp Normal file
View File

@ -0,0 +1,29 @@
{ %CPU=i8086 }
{$IFDEF FPC}
{$MODE TP}
{$ENDIF}
program tasm27;
type
TRec = record
Str: String[8];
Arr: array [-5..10] of Integer;
end;
var
Rec: TRec;
procedure x; assembler;
asm
dd Rec.Str { dd Rec.Str }
dd Rec.Str[0] { dd Rec.Str }
dd Rec.Arr { dd Rec.Arr }
dd Rec.Arr[2] { dd Rec.Arr+2 }
dd 5[7] { dd 12 }
dd 5+[7] { dd 12 }
dd 5-[7] { dd -2 }
end;
begin
end.