Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
389 views
in Technique[技术] by (71.8m points)

c++ - Inline assembly language

I am doing 64 bit migration and i need to port inline assembly code to cpp Here is he code

void ExternalFunctionCall::callFunction(ArgType resultType, void* resultBuffer)
{
    // I386

    // just copy the args buffer to the stack (it's already layed out correctly)
    int* begin = m_argsBegin;
    int* ptr = m_argsEnd;
        while (ptr > begin) {
            int val = *(--ptr);
            __asm push val
        }
    }

I want to migrate this __asm push val to cpp. This function is called four times and for every call we get different values of m_argsBegin and m_argsEnd(both m_argsBegin and m_argsEnd are dynamic arrays). This while loop executes 4 times for every call of this "callFunction" function. So, in total 4x4 = 16 values are to be stored in a "CONTINUOUS memory location" this is what "__asm push val" does i guess. I need to implement this in c++ . I tried every possible way (stack, array, Lnked list, Queue even separated this into a separate asm file but none are working) Can anyone help?

I separated this inline assembly function into a separate assembly file . Here is the code:

.386
 .model c,flat
  public callFunction_asm

CSEG segment public 'CODE'

 callFunction_asm PROC
    push ebp
    mov ebp, esp 
    mov ecx, [ebp+8] ;val
    push dword ptr [ecx]
    mov esp, ebp
    pop ebp
 RETN
 callFunction_asm ENDP
CSEG ends
END

where callFunction_asm is an extern function , I declared it as:

extern "C" void callFunction_asm(int val);

and I am calling this function as:

while (ptr > begin) {
        int val = *(--ptr);
        callFunction_asm(val); //possible replacement
    }

but even this is not working, can anyone tell where am I going wrong. I am new to assembly coding.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

push puts its operand on the stack, as well as decrementing the stack pointer.

If you looked at the stack pointer plus 1 (1($sp)), you should see the value (but if you wanted it back, you'd typically use pop).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...