Board index » delphi » CASE xx OF xx in BASM

CASE xx OF xx in BASM

Should I do this with some CMP xx, yy and JZ instructions, or is there a more easy way?
BTW, how can I work with Longint in BASM?

Ciao!

 

Re:CASE xx OF xx in BASM


Quote
tom.mert...@student.kuleuven.ac.be (Tom Mertens) wrote:
>Should I do this with some CMP xx, yy and JZ instructions, or is there a more easy way?
>BTW, how can I work with Longint in BASM?
>Ciao!

This Pascal-style case construction
  case Value of
    0: ..;
    1: ..;
    2: ..;
    else ..;
  end;

can be written in assembler like this:
  ASM     Mov   Al, Value
  @Case0: Cmp   Al, 0
          Jne   @Case1
          { code }
          Jmp   @EndOfCase
  @Case1: Cmp   Al, 1
          Jne   @CaseA
          { code }
          Jmp   @EndOfCase
  @CaseA: Cmp   Al, 'A'
          Jne   @Else
          { code }
          Jmp   @EndOfCase
  @Else:  { code }
  @EndOfCase:
  END;

If 'Value' is not a Byte, but a Word (or Integer), use 'Ax' instead of 'Al'.
If you want to use LongInt's, you have to insert an $66 before each 32-bit
instruction, eg
    'Db 66h; Mov Ax,Bx'     is equal to 'Mov eAx,eBx'
    'Db 66h; Mov Ax,Value'  is equal to 'Mov eAx,Value'

Note that you can't use immediates in this way:
    'Db 66h; Mov Ax, 7'     is NOT equal to 'Mov eAx,7'
Because the left instruction creates a 16-bit number where a 32-bit number is
required.

What you can do to use LongInt's in a Cmp-statement is defining a constant:
    const CmpEAX = $3d66;
and then instead of
    Cmp eAx, 7
use this:
    Dd CmpEAX; Dd 7; { Cmp eAx,7 }

 - Robert Beicht -
---------------------------------------------------------------------
--- Robert Beicht     e-Mail: bei...@lrz.fh-muenchen.de           ---
---               Compuserve: 100551,2212                         ---
---------------------------------------------------------------------
---                      WWW: http://www.lrz-muenchen.de/~p7003ot ---
---------------------------------------------------------------------

Other Threads