: 0xC0000005: 访问冲突写入位置 0x00000000 C++ with inline assembly
: 0xC0000005: Access violation writing location 0x00000000 C++ with inline assembly
我一直在编写这段代码来使用 C/C++ 和像这样的嵌入式汇编代码来实现 C“strcmp()”函数
bool myStrCmp(char* mystr1, char* mystr2) {
if (myStrLen(mystr1) != myStrLen(mystr1)) return false;
char s1[100], s2[100];
strcpy_s(s1, mystr1);
strcpy_s(s2, mystr2);
int i = 0;
int flag = 1;
_asm mov ecx, flag;
_asm
{
push esi
mov esi,i
startCmp:
mov al,s1[esi]
mov dl,s2[esi]
cmp al,NULL
je endCmp
cmp al,dl
jne zeroFlag
inc [esi]
jmp startCmp
zeroFlag:
mov ecx,0
endCmp:
pop esi
}
_asm mov flag, ecx
return flag == 1;
}
但是,jne zeroFlag
的确切行有一个例外,说 : 0xC0000005: Access violation writing location 0x00000000
每当我在第一个和第二个字符串中输入相似的字符时,就会发生此异常
我不知道为什么会这样
cmp al,dl
jne zeroFlag
因此,您在地址为 NULL 的 jne 指令上出错。这实际上是不可能的。记住处理器是如何工作的,它实际上在前一条指令上出错,IP 指向下一条指令;如果调试器没有对此进行调整,它就会在 cmp 指令上出错,这同样是不可能的。
只有一种可能。 运行 中的代码不是您在调试器中看到的代码。全部重建,修复你的编译错误,然后重试。
您应该将其替换为
bool myStrCmp(char* mystr1, char* mystr2) {
return 0 == strcmp(mystr1, mystr2);
}
你无法击败内置的。
您的调试器似乎在发生异常的那条指令之前的最后一条指令处停止。错误实际上在下一行:
inc [esi]
它试图增加存储在地址 esi
的值。由于 esi
为 0,因此在地址 0 处递增值会导致访问冲突。
要增加 esi
本身,只需写:
inc esi
也就是说,没有必要将 C 字符串复制到临时数组中,您可以就地比较它们(并且您可以通过比较双字来优化过程,回退到最后一个块中的字节比较).
我一直在编写这段代码来使用 C/C++ 和像这样的嵌入式汇编代码来实现 C“strcmp()”函数
bool myStrCmp(char* mystr1, char* mystr2) {
if (myStrLen(mystr1) != myStrLen(mystr1)) return false;
char s1[100], s2[100];
strcpy_s(s1, mystr1);
strcpy_s(s2, mystr2);
int i = 0;
int flag = 1;
_asm mov ecx, flag;
_asm
{
push esi
mov esi,i
startCmp:
mov al,s1[esi]
mov dl,s2[esi]
cmp al,NULL
je endCmp
cmp al,dl
jne zeroFlag
inc [esi]
jmp startCmp
zeroFlag:
mov ecx,0
endCmp:
pop esi
}
_asm mov flag, ecx
return flag == 1;
}
但是,jne zeroFlag
的确切行有一个例外,说 : 0xC0000005: Access violation writing location 0x00000000
每当我在第一个和第二个字符串中输入相似的字符时,就会发生此异常
我不知道为什么会这样
cmp al,dl
jne zeroFlag
因此,您在地址为 NULL 的 jne 指令上出错。这实际上是不可能的。记住处理器是如何工作的,它实际上在前一条指令上出错,IP 指向下一条指令;如果调试器没有对此进行调整,它就会在 cmp 指令上出错,这同样是不可能的。
只有一种可能。 运行 中的代码不是您在调试器中看到的代码。全部重建,修复你的编译错误,然后重试。
您应该将其替换为
bool myStrCmp(char* mystr1, char* mystr2) {
return 0 == strcmp(mystr1, mystr2);
}
你无法击败内置的。
您的调试器似乎在发生异常的那条指令之前的最后一条指令处停止。错误实际上在下一行:
inc [esi]
它试图增加存储在地址 esi
的值。由于 esi
为 0,因此在地址 0 处递增值会导致访问冲突。
要增加 esi
本身,只需写:
inc esi
也就是说,没有必要将 C 字符串复制到临时数组中,您可以就地比较它们(并且您可以通过比较双字来优化过程,回退到最后一个块中的字节比较).