[Back to MISC SWAG index] [Back to Main SWAG index] [Original]

    ==============================================================
                      PASCAL ARTICLE FOR PAPER
                         by Charlie Calvert
    ==============================================================

            When Pascal programmers are using BASM, they are often
    baffled when it comes time to address a field of an object. The
    issue is that the field is usually located at an offset from the
    segment of the pointer to that object, not from the data segment of
    the program. As a result, a viable way to address a field of the
    object is to first load its object's segment and offset into ES:DI.
    You can use the following line of code to do this:
        [--]
        les di, Self
        [--]
       Once you are properly addressing the object itself, then all you
    need do is calculate the offset of the field from the beginning of
    the object. This can be done by adding the proper number of bytes
    to ES:DI. For instance, if an object has three fields, all two bytes in
    size, then the offset of the third field would be four:
        [--]
        mov ax, word [es:di + 4]
        [--]
        If these kinds of calculations bother you, you can avoid them by
    loading the segment and offset of the object directly into the data
    segement, but you should be sure to save its original value on the
    stack, with a push and a pop.
        A simple illustration of the above principlese would be an object
    with 3 fields, the last being an integer called M. This example
    simply moves the value of that field into the AX register:

    ==============================================================
                            PASCAL EXAMPLE
    ==============================================================
    program AsmObj;

    type
      PMyObject = ^TMyObject;
      TMyObject = Object
        i,j: Word;
        M: Integer;
        procedure Foo;
        procedure Foo1;
      end;

    procedure TMyObject.Foo;
    begin
      asm
        les di, Self
        mov ax, word [es:di + 4]
      end;
    end;

    procedure TMyObject.Foo1;
    begin
      asm
        push ds
        lds di, Self
        mov ax, word ptr [di + M]
        pop ds
      end;
    end;

    var
      O: PMyObject;

    begin
      New(O);
      O^.M := 10;
      O^.Foo;
      O^.Foo1;
      Dispose(O);
    end.

[Back to MISC SWAG index] [Back to Main SWAG index] [Original]