了解汇编语言中的cmpb和循环

use*_*633 5 assembly

我有一个具有以下汇编代码的函数string_length

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
Run Code Online (Sandbox Code Playgroud)

由于函数名称为string_length,因此我假设它将返回字符串中有多少个字符。

我感到困惑的是

cmpb   $0x0,(%edx)
Run Code Online (Sandbox Code Playgroud)

这是否将指向edx的内容与字节0进行比较,而ASCII中的0为null。

cmpb   $0x0,(%edx,%eax,1)
Run Code Online (Sandbox Code Playgroud)

以字节为单位比较1 * eax + edx。如果edx是字符串,是否意味着edx将首先转换其ascii值,然后执行计算?

Sev*_*yev 5

这个:

cmpb   $0x0,(%edx)
Run Code Online (Sandbox Code Playgroud)

获取 EDX 指向的一个字节(即包含其地址)并将其与零进行比较。这个:

cmpb   $0x0,(%edx,%eax,1)
Run Code Online (Sandbox Code Playgroud)

获取 EDX+EAX 指向的一个字节并将其与零进行比较。EDX 作为字符串基指针,EAX 是索引。比例为 1,因为我们正在处理字节。认为整个循环的这样:for(eax=0; edx[eax] != 0; eax++)