[comp.lang.pascal] Linking assembly with Turbo Pascal

alan@io.UUCP (03/23/87)

I have just purchased Turbo Pascal for my pc compatible. I have written
an assembly language piece of code, assembled it, linked it, and
converted it to a .com file. It runs standalone, however when I
declare it an external in Turbo it does not run properly. I am
trying to access the character font rom in BIOS using es.

What does one have to save in the way of registers to use a data
segment within the assembly language function? If you have
a working example I would greatly appreciate it.

Thanks in advance.

m596008@sdsu.UUCP (04/02/87)

In article <245@io.UUCP> alan@io.UUCP writes:
>I have just purchased Turbo Pascal for my pc compatible. I have written
>an assembly language piece of code, assembled it, linked it, and
>converted it to a .com file. It runs standalone, however when I
>declare it an external in Turbo it does not run properly.

I had the same problems.  Even though I followed the Borland manuals
exactly when it came to the passed parameters and return address on the
stack.  After fiddling around I got it to work by stacking these things
differently.  I am running Turbo Pascal 3.03a on an XT.  I will dig
up this code and post the relevant sections.
			John Falkenthal
			Lowly student until May 23!
 

m596008@sdsu.UUCP (04/06/87)

What follows is an example of a procedure call, and a function call.

-------------------------------------------------------
For a procedure:
    
     procedure SET_CLOCK; external 'S_CLOCK.COM';

In the file 'S_CLOCK.COM' is the fully assembled code:

code    segment
        assume    cs:code
setclk  proc      near
        push      ax
        push      bx
;
;   various code goes in here
;
        pop       bx
        pop       ax
        ret
setclk  endp
code    ends
        end

------------------------------------------------------

For a function:

      function TIME  : integer;  external 'SP_TIME.COM';

In the file 'SP_TIME.COM' is the assembled code:

        name sp_time
        include sm8086.mac
        pseg
time1   dw      ?
        public  time
time    proc    near
        push    ss
        push    ds
        push    bp
;
;  various code in here
;
        pop     bp
        pop     ds
        pop     ss
        ret     2
time    endp
        endps
        end

Comments:
    The Turbo Tutor manual talks about this process on pages
22-3 to 22-6.  When you pass parameters back to the caller
from assembly, make sure your stack pointer is pointing to the
return address when you execute the 'ret' instruction, and the
parameters come after.
                          John Falkenthal