Assembly 实施C++;ASM x86中的调用约定

Assembly 实施C++;ASM x86中的调用约定,assembly,x86,cdecl,Assembly,X86,Cdecl,我编写了一个简单的程序,使用ASM x86对字符串进行模糊处理。用户必须输入所需的字符串,然后为要混淆的字符串选择一个键(Ekey)。(我知道您可以通过移位运算符或查表来模拟左右位旋转,我只是想让自己熟悉ASM) < >我试图改变程序,使其采用一个接受的C++标准调用程序,如 Cdecl < /> >,将参数( EKey < /C> >代码> TunChar < /代码>)放入子例程混淆> < /代码> .< 尽管我做了很多小时的研究,但都没有成功,所以我来到这里,希望有更多经验的人能提供一些指

我编写了一个简单的程序,使用ASM x86对字符串进行模糊处理。用户必须输入所需的字符串,然后为要混淆的字符串选择一个键(
Ekey
)。(我知道您可以通过移位运算符或查表来模拟左右位旋转,我只是想让自己熟悉ASM)

< >我试图改变程序,使其采用一个接受的C++标准调用程序,如<代码> Cdecl < /> >,将参数(<代码> EKey < /C> >代码> TunChar < /代码>)放入子例程<代码>混淆> < /代码> .< 尽管我做了很多小时的研究,但都没有成功,所以我来到这里,希望有更多经验的人能提供一些指导

以下是相关功能:

void obfusc_chars (int length, char EKey)
{   char tempChar;                      // char temporary store

    for (int i = 0; i < length; i++)    // encrypt characters one at a time
    {
        tempChar = OChars [i];          //
        __asm {                         //
            push   eax                  // save register values on stack to be safe
            push   ecx                  // pushes first string on stack
                                        //
            movzx  ecx,tempChar         // set up registers (Nb this isn't StdCall or Cdecl)
            lea    eax,EKey             //
            call   obfuscate            // obfuscate the character
            mov    tempChar,al          //
                                        //
            pop    ecx                  // restore original register values from stack
            pop    eax                  //
        }
        EChars [i] = tempChar;          // Store encrypted char in the encrypted chars array
    }
   return;

提前感谢您抽出时间阅读

这里到底有什么问题?您正试图从位于其他地方的代码调用内联程序集标签,对吗?那是不可能的。您需要做的是将代码写入一个单独的汇编文件,设置符号
obfuscate
global,将其编译成一个对象文件,并将其与您的程序链接在一起(声明
obfuscate
extern“C”
)@user35443抱歉,我格式化代码的方式非常糟糕,实际上,我并没有试图从其他地方编写的代码中调用。
obfuscate
子例程直接写在
for
循环的下方。请参阅:尽管如此,它还是一个只有编译器知道的标签。如果你想从C++代码中使用汇编例程,把它们称为外部符号,并把相应的编译程序集链接到程序。那么,我只想知道,为什么你来这里问我。我的代码没有任何问题,所以你为什么要告诉我这个?我只想更改参数
tempChar
EKey
的传递方式。
// Inputs: register EAX = 32-bit address of Ekey,
//                  ECX = the character to be encrypted (in the low 8-bit field, CL).

// Output: register EAX = the encrypted value of the source character (in the low 8-bit field, AL).

       __asm {

     obfuscate: push    esi
                push    ecx
                mov     esi, eax
      and dword ptr     [esi], 0xFF
      ror byte ptr      [esi], 1
      ror byte ptr      [esi], 1
      add byte ptr      [esi], 0x01
                mov     ecx, [esi]
                pop     edx
            x17:ror     dl, 1
                dec     ecx
                jnz     x17
                mov     eax, edx
                add eax, 0x20
                xor eax, 0xAA
                pop esi
                ret
        }