Search code examples
cassemblyx86strcmp

How to make strcmp to return 0 in assembly


I want the call to the strcmp function to return 0, which means

int strncmp(const char *s1, const char *s2, size_t n);

const char *s1 and const char *s2 should contain the same string. If s2 points to the string "hello" and n is 4, how can I pass to s1 a decimal value that will also correspond to hello?

 8049e87:       c7 44 24 08 04 00 00    movl   $0x4,0x8(%esp) // 4
 8049e8e:       00
 8049e8f:       c7 44 24 04 80 bd 04    movl   $0x804bd80,0x4(%esp) // the constant is "hello"
 8049e96:       08 
 8049e97:       89 04 24                mov    %eax,(%esp) // The contents of %eax are a decimal (%d)
 8049e9a:       e8 61 ec ff ff          call   8048b00 <strncmp@plt>
 8049e9f:       85 c0                   test   %eax,%eax // I want this to be 0!

I tried passing in the decimal value for "h" in ASCII, and it seemed to be the right direction, but not fully.


Solution

  • By definition, the return value of strncmp is zero for two strings that are the same in case and length.

    Looking at your assembly code, the line:

    test   %eax,%eax
    

    is not part of the strncmp function.

    Using a debugger, put a breakpoint at this instruction. Examine the EAX register, it should be zero (depending if the strncmp function returns its result in the EAX register).

    The test assembly instruction will set condition codes depending on the value of the parameters. A popular condition code bit is the zero bit indicating an expression is zero. The next instruction may be a jump if condition code is zero.

    If you use the result of the strncmp function in a mathematical statement or expression, the compiler may generate different code.

    Try this fragment:

      volatile int result = 0x55;
      volatile int a_value = 3;
      result = (strncmp("Hausaufgaben", "Hausaufgaben", 256) + 27) / 3;
      printf("Result is: %d\n", result);
    

    Is there a reason you need the compiler to save the value from strncmp?

    Is there a reason you need the compiler to compare the value to constant numeric zero?