需要帮助理解此函数中的movzbl调用

4

我正在尝试编写一些C代码,通过查看这里的汇编代码:

pushl   %ebp
movl    %esp, %ebp
movl    12(%ebp), %eax
addl    8(%ebp), %eax
movzbl  (%eax), %eax
movsbl  %al,%eax
popl    %ebp
ret

我看到有两个变量,它们被相加在一起,然后当函数开始调用movzbl和movesbl时,我就迷失了。这里发生了什么?


可能是IA-32 AT&T语法中的MOVZBL指令是做什么用的?的重复问题。 - Ciro Santilli OurBigBook.com
1个回答

12

对应的 C 函数可能是这样的:

char fn(char * string, int index)
{
    return string[index];
}

具体来说,movzbl 指令获取存储在两个参数之和处的字节,使用零填充并将其存储到 eax 中。 movsbl 指令获取 eax 的最低字节,扩展符号,并将结果存储回 eax


嗯,好的,我还有点困惑,那么如果我正在处理字符串和字符,那么 addl 调用是在做什么呢?我之前以为我在将两个整数相加。那只是将字符串和索引组合起来吗? - Daniel Love Jr
在汇编语言中,通常直到你看到结果如何被使用才能知道这一点。在这里,你可以看到从结果中进行了间接加载,所以它肯定是一个指针,因此两个参数中的一个必须是指针,另一个必须是相同大小的整数(从这段代码片段无法确定哪个是哪个)。 - microtherion
啊,好的,它试图做的事情就像你写的那样,它试图从某个字符串中获取特定的字符? - Daniel Love Jr
从技术上讲,它不一定是一个字符,我们只知道它是一个有符号的8位数量,但在许多系统中,一个字符会匹配这个配置文件。 - microtherion
啊,我明白了。那么它可能是任何东西? - Daniel Love Jr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接