How to access a C++ object member inside 80386 _asm block?


I am using VC++ v6.0 and unlikely to upgrade soon.

I have an assembly block (Intel 80386) inside of a class method.
I want to access the member variables of the class. I can access
the "this" pointer easily enough.

I am have not yet figured out the syntax for the member offset.
The following code example illustrates what I want to do.  But it
does not compile.

class_name::subroutine()
{
    _asm
    {
        mov     esx,this    ; this compiles okay
        mov     eax,offset class_name::member   ; C2415: improper operand type
        mov     eax,offset member   ; C2400: inline assembler syntax error in 'opcode';
                                                 ;                                     found 'bad token'
        mov     ebx,[esx+eax]       ; Have not got this far
    }
}

The offset operator does not work.  Does anybody know how to
get the offset of a member from within assembler???

Jim S.
Jim_SAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
beavis_shenzhenConnect With a Mentor Commented:
in vs.net , no need to call offsetof Macro , you could referece to class member freely in asm block, as following:
{
    CDialog dlg;
    __asm mov eax, dlg.m_Handle ;// yes ,compiling OK!
}
I dont have vc6.0 at hand , but I guess the vc 6.0 compiler should support this.
0
 
drichardsCommented:
I don't know how you'd do it in assembler, but it's a pretty easy workaround to calculate it piror to the asm block and then use the local variable in the asm:

    long lm = offsetof(class_name, member);
    __asm
    {
        mov esx, this  ;  Is this a typo?  Or what processor?
        mov eax, lm  ;
        mov ebx,[esx+eax]  ; again, what's esx?
    }
0
 
drichardsCommented:
>> I dont have vc6.0 at hand , but I guess the vc 6.0 compiler should support this.
It does, but unfortunately it does not seem to support dereferencing of pointers in the asm block and the intent is to get a member of the current class instance: 'this->member' and '(*this).member' do not work.

Which of course begs the question:  This is exactly the code that the compiler generates for getting a value of a member variable, so why do it in an asm block at all?
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
Jim_SAuthor Commented:
drichards>     long lm = offsetof(class_name, member);

This obviously would work.  But it had already occurred to
me that I could do:

    long local_member = member;

to put a copy of the member into a local variable and access the
data that way.  Another way would be:

    long *ptr_member = &member;

But I was hoping for something that would not rely on the C code.

-----

beavis_shenzhen>     __asm mov eax, dlg.m_Handle ;

The following compiled without error.

        _asm
        {
            mov eax,this.member
        }

Thank you.  I give you the points for this.  Just hope it
executes correctly when I get to that point.

-----

drichards>     mov ebx,[esx+eax]  ; again, what's esx?

You are right.  I meant esi, not esx.  Thank you, this has helped
me get rid of additional syntax errors.  I never liked the fact
experts-exchange requires that I award all points to only one
person.  This comment was helpful.  If I could divide the points,
I would give you some.
0
 
SteHCommented:
You can divide the points: thats called a split or split points. See
http://www.experts-exchange.com/Programming/Programming_Languages/MFC/help.jsp#hi69
how to do it. If you still want to divide your points you can ask in the community support to reopen this question that you can split the points.
0
 
AxterCommented:
Jim_S,

You should seriously question why you're doing this in the first place.
You gain nothing by using assembly language, and completely loose your portability.

This can easily be done with no assembly language, and would be much more reliable.
0
All Courses

From novice to tech pro — start learning today.