flat assembler
Message board for the users of flat assembler.

Index > Macroinstructions > How to properly implement data type casting?

Thread Post new topic Reply to topic

Joined: 12 Apr 2005
Posts: 501
Location: Belarus
zhak 18 Feb 2017, 13:41
defining params, I would like to be able to cast data types.
For example (byte) 1 or simply byte 1 to a dword-sized variable.
This is the simplest example, but stretches to complex custom data types
For instance, I have string.ucs2 data type which converts string value to UCS-2. The part of data type casting macro is as follows:

. . .
          virtual at 0
            match (type) v, value
              type v
              align size
              dbx size: value
            end match
            length = $
            load value:length from 0
          end virtual
. . .

Unfortunately, this breaks passing evaluated values like ( CONST shl 8 ) + 2
Adding match (=type?) v, value for each data type is obviously not an option, but checks like
if value relativeto 0

if value eqtype ''

throw error "extra characters on line"

How can I solve this?

Tomasz, maybe "extra characters on line" error should not be thrown at all when in IF param, simply returning false to allow further processing?
Post 18 Feb 2017, 13:41
View user's profile Send private message Reply with quote
Tomasz Grysztar

Joined: 16 Jun 2003
Posts: 8098
Location: Kraków, Poland
Tomasz Grysztar 18 Feb 2017, 14:01
Allowing a freeform text in the arguments to IF is a can of worms that I wanted to avoid in case of fasmg, so IF only allows proper expressions and processing of freeform parameters is left to MATCH.

And your problem is really devious, too - considering that symbols like "byte" are actually numeric constants. So for example "(byte) +1" is a valid numeric expression with value 2, because it is the same as "(1)+1".

You could try making some symbolic definitions that you could then detect with MATCH:
cast.byte equ ++1--

match (x) v, arg
    match ++sz--,  cast.x
        size = sz
        value = v
        value = arg
    end match
    value = arg
end match    
Post 18 Feb 2017, 14:01
View user's profile Send private message Visit poster's website Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  

< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum

Copyright © 1999-2023, Tomasz Grysztar. Also on GitHub, YouTube, Twitter.

Website powered by rwasa.