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