123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- {$ifdef FPC}
- {$ASMMODE INTEL}
- {$INLINE ON}
- {$endif FPC}
- program test;
- type
- tobj = object
- x : word;
- constructor init;
- procedure test;virtual;
- procedure testx;
- end;
- constructor tobj.init;
- begin
- x:=1;
- end;
- procedure tobj.testx;
- begin
- asm
- mov ax,3
- mov word ptr[x],ax
- end;
- end;
- procedure tobj.test;
- var
- pattern: word;
- dummyval : word;
- function rotate: boolean; assembler; {$ifdef FPC}inline;{$endif FPC}
- asm
- mov al,0
- rol word ptr [pattern],1
- rcl al,1
- end;
- { this does still not work because
- it can only work as inline not as normal sub function
- because dummyval and pattern are not reachable !! PM
- function rotateb(dummy : byte) : boolean; assembler; inline;
- asm
- movzx byte ptr [dummy],ax
- mov ax,word ptr [dummyval]
- mov al,0
- rol word ptr [pattern],1
- rcl al,1
- end; }
- var
- i : byte;
- begin
- pattern:= $a0a0;
- for i:=1 to 16 do
- begin
- Write('obj pattern = ',
- {$ifdef FPC}
- hexstr(pattern,4),' ');
- {$else}
- pattern,' ');
- {$endif}
- if rotate then
- Writeln('bit found')
- else
- Writeln('no bit found');
- end;
- end;
- procedure changepattern;
- var
- pattern: word;
- dummyval : word;
- function rotate: boolean; assembler; {$ifdef FPC}inline;{$endif FPC}
- asm
- mov al,0
- rol word ptr [pattern],1
- rcl al,1
- end;
- { this does still not work because
- it can only work as inline not as normal sub function
- because dummyval and pattern are not reachable !! PM
- function rotateb(dummy : byte) : boolean; assembler; inline;
- asm
- movzx byte ptr [dummy],ax
- mov ax,word ptr [dummyval]
- mov al,0
- rol word ptr [pattern],1
- rcl al,1
- end; }
- var
- i : byte;
- begin
- pattern:= $a0a0;
- for i:=1 to 16 do
- begin
- Write('pattern = ',
- {$ifdef FPC}
- hexstr(pattern,4),' ');
- {$else}
- pattern,' ');
- {$endif}
- if rotate then
- Writeln('bit found')
- else
- Writeln('no bit found');
- end;
- end;
- var
- t : tobj;
- begin
- changepattern;
- t.init;
- t.test;
- t.testx;
- if t.x<>3 then
- begin
- Writeln('Unable to access object fields in assembler');
- Halt(1);
- end;
- end.
|