我最近开始为某些项目使用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中,则将EBXAdd更改为2000,将导致对循环条件i < 100的下一次测试失败。

您需要在汇编代码中保存并恢复EBX寄存器,或者需要选择一个假定不跨函数调用保留的寄存器(EAXEDXECX)。

关于c++ - 英特尔C++优化器删除大量代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25345342/

10-14 14:49
查看更多