将 EAX 寄存器存储在变量中

Storing EAX register in a variable

我目前正在为一个 class 做一个额外的任务,在这个任务中我们必须从可执行文件中删除一个注册机并使用 C++ 中的 __asm 指令直接插入汇编代码 (稍作编辑)。

结果如下:

int main(int argc, char** argv) {

    char userName[] = "USERNAME";
    int serNum;

    __asm {

        LEA edx, [userName];              //put user name in edx

        LEA eax, DWORD PTR[edx];          //put user name in eax
        LEA ebx, DWORD PTR[userName + 1]; // put "sername" in ebx
        MOV ecx, 0x00000000;              // random initializing
        MOV ebp, 0x00000000;
        MOV esi, 0x00000000;
        MOV edi, 0x00000000;

    COUNT_loop:;

        MOV CL, BYTE PTR DS : [eax];     // code to get length of user name
        INC eax;
        TEST CL, CL;
        JNZ SHORT COUNT_loop;

        SUB eax, ebx;
        MOV ebx, eax;
        SAR ebx, 1;
        MOVSX ebp, BYTE PTR DS : [ebx + edx];
        IMUL ebp, ebp, 0x3E8;
        XOR eax, eax;

        CMP ebx, 2;
        JL SHORT SKIP_jump;

        MOV edi, edi;

    GEN_loop:;

        MOVSX ecx, BYTE PTR DS : [edx + eax];        //generate the key somehow
        LEA ecx, DWORD PTR DS : [ecx + ecx * 4];
        LEA esi, DWORD PTR DS : [esi + ecx * 2];
        MOVSX ecx, BYTE PTR DS : [edx + eax + 1];
        LEA ecx, DWORD PTR DS : [ecx + ecx * 4];
        LEA edi, DWORD PTR DS : [edi + ecx * 2];
        ADD eax, 2;
        LEA ecx, DWORD PTR DS : [ebx - 1];
        CMP eax, ecx;
        JL SHORT GEN_loop;

    SKIP_jump:;

        CMP eax, ebx;
        JGE SHORT ODD_skip;
        MOVSX eax, BYTE PTR DS : [eax + edx];
        LEA edx, DWORD PTR DS : [eax + eax * 4];
        LEA ebp, DWORD PTR SS : [ebp + edx * 2];

    ODD_skip:;

        LEA eax, DWORD PTR DS : [edi + esi];
        ADD eax, ebp;                                  // store final key in eax
    };
}

问题是我现在需要 EAX 的内容。我不确定如何将 EAX 存储在另一个变量中。有任何想法吗?我从未使用过汇编,有人告诉我我不必知道如何使用它。我觉得他们骗了我们....

您可以在程序的 C 部分声明一个 int(或 unsigned int),然后执行

mov cvariable, eax

在线汇编程序块中。

x86 的常用函数调用约定是 cdecl,其中函数的整数 return 值保存在 EAX 寄存器中。例如,一个简单的汇编函数可以是:

#include "stdio.h"

int f()
{
    __asm
    {
        mov eax, 42 // setting EAX to 42 here
    }
}

int main()
{
    int i = f();
    printf("%i\n", i);

    return 0;
}

您所使用的似乎是 Intel 语法,因此您可能希望使用 -masm=intel 标志编译该内联程序集。

在 Windows 10 64 位上使用 Visual Studio 编译,运行 可执行文件将在终端中生成:

42

原来的 f() 在功能上等同于(据我所知):

int f()
{
    return 42;
}