如何解决X86汇编:为什么基本块具有cmp和测试指令,似乎重复工作
这是我的c函数:
bool equalA = true;
for (int i = 0; i < 4; i++) {
if (str[i] != 'a') {
equalA = false;
}
}
if (equalA == true) {
if(str.compare(4,6,"matches")) {
printf("%s","matches\n");
}
}
这是patial汇编代码:
movzbl (%rax),%eax
cmpb $97,%al
setne %al
testb %al,%al
je .L5
movb $0,-981(%rbp)
.L5:
addl $1,-980(%rbp)
jmp .L6
上面的代码用'a'检查str [i],如果不相等,movb将equalA设置为false。如果相等,则跳至.L5。并继续循环。
我的问题是: 不应该
cmpb $97,%al
je .L5
会做同样的工作吗?
如果str [i] =='a',则将设置zflag,je .L5将采用该分支。 如果str [i]!='a',zflag将被清除。 je .L5不会接这个分支。
为什么在cmpb指令后编译器会生成两行额外的代码?
解决方法
您是对的,它应该执行相同的操作。我假设您没有在启用优化的情况下进行编译。很难解释为什么C编译器会生成某些代码。不同的编译器btw可能生成了不同的代码。尽管启用了优化,但仍有可能生成此代码。
但是,这过于简化了,有关程序优化的更多详细信息,请参见下面@PeterCordes的精彩评论。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。