Solved

Detour, "Inline" asm. Access Violation. C++ to Delphi translation

Posted on 2009-07-10
2
353 Views
Last Modified: 2013-11-05
This one is driving me bananas as it works in C++ and not in Delphi when to my eyes everything is the same. It's probably the way C++ handles variables from classes.

Anyway this is a small section for what I have:

  If Not(bNoRegs) Then
    begin
    Buffer.BufferAdd(Byte($89));
    Buffer.BufferAdd(Byte($0D));
    Buffer.BufferAdd(DWORD(@pClassInstance));
  end;

This is what it is in c++:

      if(!m_bNoRegs)
      {
            Buffer += (BYTE)0x89; //mov dword ptr, ecx
            Buffer += (BYTE)0x0D;
            Buffer += (DWORD)&m_pClassInstance;
      }

The Buffer variable isn't the issue as when the asm is written from the buffer it comes out right.
Now when each class is made the pClassInstance is set to nil(NULL in c++) it is a Pointer(BYTE * in c++). Now what is supposed to happen is pClassInstance is supposed to be set to ECX.
I.E. If ECX is $5E0000 pointer then pClassInstance should be equal to that. The same thing as doing pClassInstance := Pointer($5E0000);.

Now when this is executed on the delphi side I get an AV about not being able to access it.

Any ideas? If you need any other parts of the code just ask.
0
Comment
Question by:ThievingSix
[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
2 Comments
 
LVL 39

Accepted Solution

by:
itsmeandnobodyelse earned 500 total points
ID: 24821760
I don't know Delphi but in C/C++

 (DWORD)&m_pClassInstance;

means

that the address of the pointer variable was pushed to the buffer and not the address the pointer was pointing to. That normally is a way to specify an output argument cause the callee might change the pointer value that way and the caller will get the new address assigned to m_pClassInstance.

0
 
LVL 13

Author Comment

by:ThievingSix
ID: 24821889
"Yeh thats what I assumed it was. MOV DWORD PTR DS:[&m_pClassInstance] essentially dereferences the pointer. Since pClassInstance is pointing to nothing it's value is 0. When I debugged the program and stepped through the asm it was indeed the pointer to the variable and not what the pointer was pointing to. I still don't understand why the"

That was as far as I got in my reply until I realized why the variable couldn't be accessed. The code section:
           
            Buffer += (BYTE)0x89; //mov dword ptr, ecx
            Buffer += (BYTE)0x0D;
            Buffer += (DWORD)&m_pClassInstance;

It never got EXECUTE privileges!  Thanks to you confirming what I did was right it dawned on me! Thanks.
 
0

Featured Post

Independent Software Vendors: 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!

Question has a verified solution.

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

This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

696 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