[fpc-pascal]Intel ASM syntax problem

Jonas Maebe jonas at zeus.rug.ac.be
Mon Jun 25 17:37:09 CEST 2001

On maandag, juni 25, 2001, at 05:17 , Aitor Santamaria Merino wrote:

>  am trying to compile this (which compiles under TP): (using asm and
> {$ASMMODE Intel}):
> (66) mov word ptr ds:ControlBlk25[bx].StartSector,ax
> (67) mov word ptr ds:ControlBlk25[bx].StartSector[2],ax
> where
>  ControlBlk25  = record   { control block for INT 25 extended call }
>    StartSector : LongInt; { start sector to read }
>    Count       : Word;    { number of sectors to read }
>    BufferOffs  : Word;    { data buffer offset }
>    BufferSeg   : Word;    { data buffer segment }
>  end;
> The problem appears when it reaches the [bx]:
> drvscan.pp(66,18) Fatal: Syntax error, [ expected but identifier found
> Any alternative/correction?

First of all: you will most likely have to rewrite almost all your 
assembler routines, because you now work in a 32bit memory model. This 
means that anything that  uses segments (including lds/les) or memory 
address expressions containing registers (such as the above) will have 
to change. The reason is that there are no segments anymore, only 
selectors (which you normally can ignore, you can assume all of your 
data is in the DS selector, except if you need to access video memory or 
so) and all offsets are 32bits (so you'd need at least ebx instead of bx 
in the above example).

Second, you won't be able to pass a data structure from you program to a 
Dos interrupt call the way you are trying it, because Dos can only work 
with the first megabyte of memory and in segment:offset format, while 
FPC programs work with all memory in your computer and that data 
structure most likely lies way above the first megabyte. You will need 
the dosmemput/dosmemget/global_dos_alloc/global_dos_free routines from 
the go32 unit. I suggest you throughly read the docs of that unit before 
attempting things like this

Third: there may indeed be bugs in the assembler reader. It should 
compile if you change it to

mov word ptr ControlBlk25[ebx].StartSector,ax

but I'm not sure (you definitely need a 32bit register as offset, I 
don't think we support the generation db 67h prefixes to allow 16bit 
registers in memory expressions).


More information about the fpc-pascal mailing list