: 0xC0000005: Access violation writing location 0x00000000 C++ with inline assembly

-1

I've been writing this code to implement the C "strcmp()" function using C/C++ with embedded assembly code like this

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;

}

However, there is an exception at the exact line of jne zeroFlag saying : 0xC0000005: Access violation writing location 0x00000000

this exception happens whenever I enter a similar charecters in the first and second string generally

I have no idea why does this happen

c++
assembly
x86
inline-assembly
asked on Stack Overflow Apr 18, 2021 by HuangLinBao • edited Apr 18, 2021 by rustyx

2 Answers

2

It seems your debugger stops at the last instruction before the one where an exception occurred. The error is actually at the next line:

inc [esi]

That tries to increment a value stored at address esi. Since esi is 0, incrementing a value at address 0 results in an access violation.

To increment esi itself, simply write:

inc esi

With that said, there's no need to copy C-strings into temporary arrays, you can compare them in-place (and you can optimize the process by comparing in dwords, falling back to a byte compare in the last chunk).

answered on Stack Overflow Apr 18, 2021 by rustyx • edited Apr 18, 2021 by rustyx
1
        cmp al,dl
        jne zeroFlag

So, you fault on the jne instruction with address NULL. This is literally impossible. Remembering how the processor works, it actually faulted on the previous instruction and IP points to the next one; if the debugger doesn't adjust for this it faulted on the cmp instruction, which is equally impossible.

Only one possibility. The code your running is not the code you see in the debugger. Rebuild all, and fix your compilation errors, and try again.

You should just replace this with

bool myStrCmp(char* mystr1, char* mystr2) {
    return 0 == strcmp(mystr1, mystr2);
}

You can't beat the builtin.

answered on Stack Overflow Apr 18, 2021 by Joshua

User contributions licensed under CC BY-SA 3.0