【问题标题】:Why do i get access violation at mov [edx], al?为什么我在 mov [edx], al 处遇到访问冲突?
【发布时间】:2014-11-29 09:28:18
【问题描述】:

我在 Visual Studio 中编写了这段代码,但我不知道为什么它会在 mov [edx], al.谁能帮我解释一下?

int main()
{
    char z[10] = "banana";
    _asm
    {
        lea     ecx, z;
        mov     edx, [ecx];
        inc     edx;
        mov     [ecx], edx;
        dec     edx;
        mov     al, 31;
        mov     [edx], al;
        mov     eax, 31;
        and     eax, 0FFh
    }
}

【问题讨论】:

  • 您在mov edx, [ecx]mov [ecx], edx 行的访问可能未对齐
  • 你能举几个例子吗?

标签: assembly x86 mov


【解决方案1】:

EDX 保存z 的前4 个字节(mov edx, [ecx]不是z 的地址。如果您将EDX“投射”到带有方括号的地址,您会指向任何地方,但肯定不会更正内存。我无法显示有效的代码,因为我不知道您想要做什么。

看着your last post,我猜你想做这样的事情:

#include <stdio.h>

__declspec (naked) char khanh_asm (char a, char** b)
{
    _asm
    {
        mov     ecx, [esp+8]
        mov     edx, [ecx]
        inc     edx
        mov     [ecx], edx
        dec     edx
        mov     al, [esp+4]
        mov     [edx], al
        mov     eax, [esp+4]
        and     eax, 0FFh
        retn
    }
}

int main( void )
{
    char b[] = "banana";
    char* P = b;

    printf("%s \n", b);

    khanh_asm ( '1', &P);
    printf("%s \n", b);

    khanh_asm ( '2', &P);
    printf("%s \n", b);

    return 0;
}

【讨论】:

  • 我在 KeygenMe 程序中看到了这段代码,但我无法理解它的作用。所以我在 Visual Studio 中再次编写它,尽可能简单地理解它,但我得到了那个错误。
猜你喜欢
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多