我最近开始为某些项目使用Intel C++编译器,同时还学习了masm汇编。我一直在听,这是不值得学习的汇编语言,因为无论如何,编译器在优化代码方面都做得很好,因此考虑考虑一下哪一个是一劳永逸的。为此,我使用了以下c++代码:
#include <iostream>
#include <time.h>
using namespace std;
extern "C" {
int Add(int a, int b);
}
int main(int argc, char * argv[]){
int startingTime = clock();
for (int i = 0; i < 100; i++)
{
cout << "normal: " << i << endl;
cout << 1000 + 1000 << endl;
}
int timeTaken1 = clock() - startingTime;
startingTime = clock();
for (int i = 0; i < 100; i++){
cout << "assem" << i << endl;
cout << Add(2000, 2000) << endl;
}
int timeTaken2 = clock() - startingTime;
cout << "Time taken under normal addition: " << timeTaken1 << endl;
cout << "Time taken under assembly addition: " << timeTaken2 << endl;
cin.get();
return 0;
}
以及以下masm代码:
.model flat
.386
.code
public _Add
_Add PROC
push ebp ;
mov ebp, esp ;
mov eax, [ebp + 8] ;
mov ebx, [ebp + 12] ;
add eax, ebx ;
leave ; cleanup
ret ;
_Add endp
end
我正在使用Visual Studio通过Intel Composer插件对此进行编译。当我在Debug模式下运行此程序时,它可以完美运行-我可以看到“normal 99”和“assem 99”以及相关数字。当我使用为编译器指定的/ 0d运行它时,它也可以正常工作。但是,当指定/ 02,/ 0x或/ 03时,它仅显示常规(i + j)加法循环,并且仅显示汇编程序加法的第一个值,即仅显示Assem 0和4000。
我的猜测是汇编代码正在由Intel编译器进行优化(这在VC++编译器上可以很好地工作),并且很好奇地找出了为什么会发生这种情况以及如何解决该问题,同时仍然让Intel优化了C++。部分。
谢谢
蜘蛛
编辑:
我知道这很晚了,但是感谢所有答复。看来这是汇编代码中的错误,而不是intel编译器未使用汇编代码。
最佳答案
您的汇编代码浪费了EBX
寄存器(如Jongware所述),这可能就是为什么C++代码中的第二个循环仅执行一次的原因。如果将i
存储在EBX
中,则将EBX
的Add
更改为2000,将导致对循环条件i < 100
的下一次测试失败。
您需要在汇编代码中保存并恢复EBX
寄存器,或者需要选择一个假定不跨函数调用保留的寄存器(EAX
,EDX
或ECX
)。
关于c++ - 英特尔C++优化器删除大量代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25345342/