Understand cmpb and assembly language loops

I have a string_length function that has the following assembly code

0x08048e90 <+0>:     push   %ebp
0x08048e91 <+1>:     mov    %esp,%ebp
0x08048e93 <+3>:     mov    0x8(%ebp),%edx     // assign whatever I declared into edx
0x08048e96 <+6>:     mov    $0x0,%eax          // assign eax = 0
0x08048e9b <+11>:    cmpb   $0x0,(%edx)        // compare edx to byte of 0 (null..?)
0x08048e9e <+14>:    je     0x8048ea9 <string_length+25>   // if equal, jump to +25
0x08048ea0 <+16>:    add    $0x1,%eax          // else, add 1 to eax
0x08048ea3 <+19>:    cmpb   $0x0,(%edx,%eax,1) // compare byte 1*eax+edx with 0, 
0x08048ea7 <+23>:    jne    0x8048ea0 <string_length+16>   // if not equal, back to +16
0x08048ea9 <+25>:    pop    %ebp               // pop ebp
0x08048eaa <+26>:    ret

Since the function name is string_length, I assume that it will return the number of characters in the string.

I am confused by the fact that

cmpb   $0x0,(%edx)

is this a comparison of what is specified in edx for byte 0 and 0 in ASCII is null ..?

and

cmpb   $0x0,(%edx,%eax,1)

compares in bytes 1 * eax + edx. If edx is a string, does this mean that edx first converts its ascii value and then performs the calculation?

+4
source share
2 answers

It:

cmpb   $0x0,(%edx)

takes a byte that EDX points to (i.e. contains an address) and compares it to zero. It:

cmpb   $0x0,(%edx,%eax,1)

, EDX + EAX . EDX , EAX - . 1, . : for(eax=0; edx[eax] != 0; eax++).

+3

C :

int string_length(const char *edx)
{
    int eax = 0;
    while (edx[eax] != NULL) eax++;
    return eax;
}
+1

Source: https://habr.com/ru/post/1534574/


All Articles