c++ - 英特尔 C++ 优化器删除了 masm 代码

标签 c++ c masm icc intel-composer

我最近开始在我的一些项目中使用英特尔 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。

我的猜测是英特尔编译器正在优化汇编代码(这适用于 VC++ 编译器),我很想知道为什么会发生这种情况以及如何解决它,同时仍然让英特尔优化C++部分。

谢谢 Sb蜘蛛

编辑: 我知道这已经晚了,但感谢所有回复。看来是汇编代码出错,而不是intel编译器没有使用汇编代码。

最佳答案

您的汇编代码破坏了 EBX注册(如 Jongware 所述),这可能是为什么 C++ 代码中的第二个循环只执行一次的原因。如果i存储在 EBX然后改变EBX到 2000 年 Add将导致循环条件的下一次测试i < 100失败。

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

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

相关文章:

assembly - 在 MASM 中调用 c 的 print

c++ - 无论如何有一个 valgrind 消息 "Conditional jump or move depends on uninitialized value"可以是所谓的 'false positive'

c++ - 递归回溯数独求解器问题,C++

c++ - 如何在 C++ 中将 CString 转换为 double?

c - 关于C中动态内存分配的问题

c - 包含结构数组的结构不能由相同类型列表中的值分配

c - C中的'do'关键字

c++ - 在汇编文件中调用 C++ 函数

汇编 x86 MASM 循环分析

c++ - 非逻辑代码流/无效 vector 操作