2014-04-02 36 views
4

CMPB和循环我有一个函数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 

由于函数名字符串长度,我假设它会返回多少个字符是的字符串中。

我感到困惑的是

cmpb $0x0,(%edx) 

这是比较无论是指出,EDX为0字节,并以ASCII 0是空..?

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

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

回答

3

此:

cmpb $0x0,(%edx) 

需要该EDX点(即包含的地址。),并将其与零字节。这:

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

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

1

等价的C代码将是这样的:

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