• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 594
  • Last Modified:

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.
0
Jim_S
Asked:
Jim_S
1 Solution
 
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
 
beavis_shenzhenCommented:
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 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
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now