需要帮助理解此函数中的 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
指令获取存储在两个参数之和处的字节,用零填充它,并将其存储到eax
。 movsbl
指令获取 eax 的最低字节,对其进行符号扩展,并将结果存储回 eax。
【讨论】:
Hrm,好吧,我还是有点困惑,所以如果我在处理字符串和字符,那么 addl 调用是做什么的呢?我以前以为我是在将两个整数相加。这只是结合了字符串和索引吗? 在汇编程序中,您通常不知道这一点,直到您看到结果是如何使用的。在这里,你看到结果有间接加载,所以它一定是一个指针,所以两个参数之一必须是指针,另一个是相同大小的整数(从这里无法判断代码 sn-p 这是哪个)。 啊,好吧,所以它试图做的就像你写的那样,它试图从某个字符串中获取特定字符? 从技术上讲,它不一定是一个字符,我们只知道它是一个有符号的 8 位数量,但在许多系统上,一个字符会匹配该配置文件。 啊,我明白了。所以它可能是什么?以上是关于需要帮助理解此函数中的 movzbl 调用的主要内容,如果未能解决你的问题,请参考以下文章
调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段
关于将程序集转换为 c 的问题——特别是 movzbl 指令的作用? [复制]