【问题标题】:C inline Assembly generating unhandled exceptionC 内联汇编生成未处理的异常
【发布时间】:2017-04-04 03:50:34
【问题描述】:

所以我有这个用 C 编写的函数

int transform ( char * p )
{
    if(*p!='-'){
        return 0;
    }

    p++;
    if(*p == 'a')
    {
        return 1;
    }
    else if(*p == 'b')
    {
        return 2;
    }
    else
    {
        return 0;
    }
}

我试图将它翻译成这样的内联汇编 ia32

    int trasform ( char * p )
    {
        int result; 
        _asm
        {
            mov eax, p
            mov ebx, 0
            mov bl, [eax]
            cmp bl, '-'   ;
                jne invalid
                mov bl, [4*eax]
            cmp bl, 'a'
                jne isB
                mov result, 1
                mov eax, result
            jmp out
    isB:
            cmp bl, 'b'
                jne invalid
                mov result, 2
                mov eax, result
            jmp out 
    invalid:
            mov result, 0  
            mov eax, result
    out: ; end

    }
    return result;
}

当我用 C 语言编写函数时,它在 Visual Studio 中可以完美运行,但是当我将其更改为内联汇编并执行代码时,我得到一个错误提示

proyect.exe 中 0x774e15ee 处的未处理异常:0xC0000005:访问冲突读取位置 0x01745388。

这个问题是代码的问题还是Visual Studio的问题?

我调试了我的代码,发现错误在这一行

mov bl, [4*eax] 

【问题讨论】:

  • transform 怎么称呼?我质疑在p++ 之后取消引用p 的合法性。
  • @Bathsheba 在主函数中,我收到作为命令参数 -b 或 -a 的命令,所以我调用转换函数来查看我收到的参数是否有效。 arg = argv[3];然后 int op = transform(arg);
  • Visual Studio 允许您通过一次执行一条指令来调试代码(如果我没记错,请按 F11)。这将指向一条产生异常的特定指令。请edit你的帖子并写下这条指令是什么——这是解决你的问题的非常重要的信息!
  • @anatolyg 好的,我已经这样做了

标签: c visual-studio assembly x86 inline-assembly


【解决方案1】:
mov bl, [4*eax]
 cmp bl, 'a'

这个想法是推进EAX中的指针。不用倍增!

inc eax              ;ptr++
mov bl, [eax]
cmp bl, 'a'

【讨论】:

    【解决方案2】:

    正如调试器所示,问题出在这条指令上:

    mov bl, [4*eax]
    

    看C代码,其目的是将字符串的第二个字节加载到bl中。指向第一个字节的指针是eax,所以指向第二个字节的指针是eax+1。也就是说,正确的命令是

    mov bl, [eax+1]
    

    或者,您可以使用两条指令来做到这一点:

    inc eax
    mov bl, [eax]
    

    这更符合C代码:

    p++;
    if (*p == ...)
    

    但也一样。

    【讨论】:

      【解决方案3】:

      您想读取“-”之后的字节,该字节位于eax+1,而不是4*eax

      【讨论】:

        猜你喜欢
        • 2021-07-17
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        相关资源
        最近更新 更多