Contributor: IAN LIN { Updated MISC.SWG on May 26, 1995 } { > PROCEDURE test(portno: word; value: byte; VAR result: BYTE); > ASSEMBLER; > ASM > mov dx, portno > mov al, value > out dx, al > in dx, al > mov di, OFS(result); (*) > stosb > END; > (*): This is the problem: you can't use the OFS() function > in an ASM statement. No problem. You use les di,result. } procedure test(portno:word; value:byte; var result:byte); assembler; asm mov dx,portno mov al,value out dx,al in dx,al les di,result mov es:[di],al end; { es:di becomes segment:offset to Result. I think this would work as a function better. It is similar but less code. Function results are in AX for works, AL for bytes, AX:DX for pointers. } function test(portno:word; value:byte:byte; assembler; asm mov dx,portno mov al,value out dx,al in dx,al end; { All done. AL's value is returned as the Byte result right away. }