Here is my c function:
bool equalA = true;
for (int i = 0; i < 4; i++) {
if (str[i] != 'a') {
equalA = false;
}
}
if (equalA == true) {
if(str.compare(4, 6, "matches")) {
printf("%s", "matches\n");
}
}
Here is the patial assembly code:
movzbl (%rax), %eax
cmpb $97, %al
setne %al
testb %al, %al
je .L5
movb $0, -981(%rbp)
.L5:
addl $1, -980(%rbp)
jmp .L6
The code above checks str[i] with 'a', if not equal, movb set equalA to false. If equal, jump to .L5. and continue for loop.
My question is: Shouldn't
cmpb $97, %al
je .L5
would do the same work?
if str[i] == 'a', zflag will be set, je .L5 would take the branch. if str[i] != 'a', zflag will be cleared. je .L5 would not take the branch.
Why Compiler generates two lines of extra code after cmpb instruction?