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

Posted

技术标签:

【中文标题】需要帮助理解此函数中的 movzbl 调用【英文标题】:need help understanding the movzbl call in this function 【发布时间】:2014-06-16 22:43:00 【问题描述】:

所以我试图通过查看这里的程序集来编写一些 C 代码:

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

我看到我有两个变量,它们被加在一起,然后当函数开始调用 movzbl 和 movebl 时我迷路了。这是怎么回事?

【问题讨论】:

What does the MOVZBL instruction do in IA-32 AT&T syntax? 的可能重复项 【参考方案1】:

对应的 C 函数类似于

char fn(char * string, int index)

    return string[index];

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

【讨论】:

Hrm,好吧,我还是有点困惑,所以如果我在处理字符串和字符,那么 addl 调用是做什么的呢?我以前以为我是在将两个整数相加。这只是结合了字符串和索引吗? 在汇编程序中,您通常不知道这一点,直到您看到结果是如何使用的。在这里,你看到结果有间接加载,所以它一定是一个指针,所以两个参数之一必须是指针,另一个是相同大小的整数(从这里无法判断代码 sn-p 这是哪个)。 啊,好吧,所以它试图做的就像你写的那样,它试图从某个字符串中获取特定字符? 从技术上讲,它不一定是一个字符,我们只知道它是一个有符号的 8 位数量,但在许多系统上,一个字符会匹配该配置文件。 啊,我明白了。所以它可能是什么?

以上是关于需要帮助理解此函数中的 movzbl 调用的主要内容,如果未能解决你的问题,请参考以下文章

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

关于将程序集转换为 c 的问题——特别是 movzbl 指令的作用? [复制]

需要帮助理解 _set_security_error_handler()

如何使用addJavaScriptInterface

从代码中调用按钮单击的函数

在java中回调函数怎么理解,android中的回调函数和java中有区别吗?