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.
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?