Solved

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

Posted on 2004-09-09
6
569 Views
Last Modified: 2008-01-09

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
Comment
Question by:Jim_S
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
6 Comments
 
LVL 19

Expert Comment

by:drichards
ID: 12023819
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
 
LVL 1

Accepted Solution

by:
beavis_shenzhen earned 250 total points
ID: 12023922
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
 
LVL 19

Expert Comment

by:drichards
ID: 12024064
>> 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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:Jim_S
ID: 12024173
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
 
LVL 13

Expert Comment

by:SteH
ID: 12024478
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
 
LVL 30

Expert Comment

by:Axter
ID: 12026320
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

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

751 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question