- Код: Выделить всё
program tst;
uses sysutils;
var rammem:array of byte;
i:integer;
function gmb(addr:dword):pbyte;
begin result:=@rammem[addr]; end;
function gmw(addr:dword):pword;
begin result:=@rammem[addr]; end;
function gmd(addr:dword):pdword;
begin result:=@rammem[addr]; end;
begin
setlength(rammem,1024*1024);
for i:=0 to 1024*1024-1 do rammem[i]:=random(256);
writeln(´st=´,inttohex(dword(@rammem[0]),4));
writeln(´1.1=´,inttohex(gmb($F0000)^,1));
writeln(´1.2=´,inttohex(gmb($F0001)^,1));
writeln(´1.3=´,inttohex(gmb($F0002)^,1));
writeln(´1.4=´,inttohex(gmb($F0003)^,1));
writeln(´2.1=´,inttohex(gmw($F0000)^,2));
writeln(´2.2=´,inttohex(gmw($F0001)^,2));
writeln(´2.3=´,inttohex(gmw($F0002)^,2));
writeln(´2.4=´,inttohex(gmw($F0003)^,2));
writeln(´4.1=´,inttohex(gmd($F0000)^,4));
writeln(´4.2=´,inttohex(gmd($F0001)^,4));
writeln(´4.3=´,inttohex(gmd($F0002)^,4));
writeln(´4.4=´,inttohex(gmd($F0003)^,4));
end.
Скомпилированная для x86 она выдаёт правильный вывод:
st=830040
1.1=F0000=1=7A
1.2=F0001=1=4A
1.3=F0002=1=8E
1.4=F0003=1=26
2.1=F0000=2=4A7A
2.2=F0001=2=8E4A
2.3=F0002=2=268E
2.4=F0003=2=626
4.1=F0000=4=268E4A7A
4.2=F0001=4=6268E4A
4.3=F0002=4=FB06268E
4.4=F0003=4=AFB0626
Но, скомпилированная для ARM она выдаёт ерунду:
st=40048020
1.1=F0000=1=7A
1.2=F0001=1=4A
1.3=F0002=1=8E
1.4=F0003=1=26
2.1=F0000=2=4A7A
2.2=F0001=2=4A7A
2.3=F0002=2=268E
2.4=F0003=2=268E
4.1=F0000=4=268E4A7A
4.2=F0001=4=7A268E4A
4.3=F0002=4=4A7A268E
4.4=F0003=4=8E4A7A26
Что-то не то с указателями в FPC для ARM-linux - невозможен доступ о адресам не кратным размеру указателя.
С-эквивалент программы работат нормально, так что это не от аппаратуры.
Что делать, как чинить?