【问题标题】:Access violation writing location is occuring in Assembly程序集中发生访问冲突写入位置
【发布时间】:2017-07-06 00:40:18
【问题描述】:

我正在使用 Assembly 编程,出现以下错误:

Application1.exe 中 0x00B71792 处引发异常:0xC0000005:访问冲突写入位置 0x00B76BED。

Application1.exe 中 0x00B71792 处的未处理异常:0xC0000005:访问冲突写入位置 0x00B76BED。

我正在使用 Visual Studio 进行编程。下面是我的代码:

char *strCat(char *dest, char *src) {
    __asm {
        xor eax, eax
        mov ecx, 0xffffffff
        mov esi, src
        mov edi, dest
        mov al, 0
        cld
        repne scasb
        dec edi
    L0 :
        lodsb
        stosb
        test al, al
        jne L0
        mov eax, edi
    };
}

根据调试,stosb指令出现错误。

在我看来,代码是正确的。找不到错误。

【问题讨论】:

  • 您是否在 VIsual Studios 的 C++ 调试器中单步执行了内联汇编程序来观察会发生什么?
  • 值 0xffffffff 看起来很可疑。它有什么用?
  • 我们需要知道你用来调用那个函数的参数。您不能随意连接字符。例如,strCat("abc", "123") 很可能会崩溃。
  • 没有 cmets 的汇编语言是没用的。有人告诉我,重写没有 cmets 的汇编代码比试图理解它更有效率。
  • 见上面@PaulMcKenzie 的评论。你不能那样做。你知道 C 吗?

标签: c++ visual-studio assembly visual-c++


【解决方案1】:

崩溃的问题是您试图将字符连接到字符串文字上。这是 C++(和 C)中未定义的行为。

为了安全地调用你的函数,你必须

1) 确保您的目标缓冲区足够大以容纳连接的字符串,并且

2) 目标缓冲区是可写内存,而不是字符串。

要使内存可写,一种方法是简单地声明一个足够大以容纳整个连接字符串的 char 数组:

char destination[100] = "abc";
strCat(destination, "123");

【讨论】:

  • 谢谢你!它对我有用。该功能按设计工作
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 2020-09-04
  • 2012-12-05
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多