【发布时间】: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