Assembly w/QB

 BBS: Inland Empire Archive
Date: 09-03-92 (21:14)             Number: 314
From: MATT HART                    Refer#: NONE
  To: BRETT EMERY                   Recvd: NO  
Subj: Assembly w/QB                  Conf: (2) Quik_Bas
 BE> crash.  Could someone tellme which registers QB relys on, and

     QB expects the direction flag to be reset (CLD instruction).

     If you change DS, PUSH and POP it.  It needs to be the
same as when you called the routine.

     You should just about NEVER change the CS register.  If you are going to
do it anyway, save and restore it.  But you really
shouldn't change it.  The same goes with the BP and SP
registers.  If you need them, put them into a variable or
another register first and use the data there.  MASM
includes compiler directives (or macros or whatever USES
is) to make saving the registers easy.  Here's one of my
sample ASM files.  Improve it by passing parameter BYVAL
(by value) rather than by reference, and do a word move
rather than a byte move, moving a single byte first if the
NumBytes parameter isn't even ( shift CX right 1, look at
the carry flag, jump to a single byte move, then continue).

     DS comes in as QB's Dgroup.  BP comes in with the stack QB pushed before
jumping (4 bytes for QB's return address, and 2 bytes or so
for each parameter - they are usually near address' into DS
for the value of the parameter).

;MEMCOPY.ASM
;
;Call MemCopy (FromSegment, FromAddress, ToSegment, ToAddress, NumBytes)
;
;All parameters must be integers

.Model Medium,BASIC
.Code

MemCopy PROC USES DS ES SI DI, FSeg:Ptr, FAdr:Ptr, TSeg:Ptr, TAdr:Ptr,
                               NumBytes:Ptr

    CLD                    ;Forward move

    MOV  BX,FAdr           ;FAdr pointer
    MOV  SI,[BX]           ;Put into SI register
    MOV  BX,TSeg           ;TSeg pointer
    MOV  ES,[BX]           ;Put into ES register
    MOV  BX,TAdr           ;TAdr pointer
    MOV  DI,[BX]           ;Put into DI register
    MOV  BX,NumBytes       ;NumBytes pointer
    MOV  CX,[BX]           ;Put into CX register
    MOV  BX,FSeg           ;FSeg pointer

    PUSH DS                ;Save DS to restore after move
    MOV  DS,[BX]           ;Put FSeg into DS register
    REP  Movsb             ;Move DS,SI to ES,DI
    POP  DS                ;Restore DS

    RET                    ;return to BASIC

MemCopy ENDP
END
---
 * Origin: Midnight Micro!  V.32/REL  (918)451-3306 (1:170/600)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET