C内联汇编生成未处理的异常

时间:2016-11-20 19:35:56

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

所以我用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] 

3 个答案:

答案 0 :(得分:3)

this.dataService.getPlaces()
  .map(data => data.json())
  .map(items => items.map(
    item => <Place>({item.place.name, item.place})
  )
);

想法是在mov bl, [4*eax] cmp bl, 'a' 中推进指针。不需要倍增它!

EAX

答案 1 :(得分:1)

正如调试器所指出的那样,问题出在这条指令中:

mov bl, [4*eax]

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

mov bl, [eax+1]

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

inc eax
mov bl, [eax]

这更符合C代码:

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

但也一样。

答案 2 :(得分:1)

您希望读取&#39; - &#39;之后的字节,该字节位于eax+1,而不是4*eax