mov 指令用c语言写,c – 使用Microsoft编译器生成CMOV指令

为了在运行

Windows 7 pro的intel核心2上找到一些cmov指令,我编写了下面的代码.它所做的就是从控制台获取一个字符串作为输入,应用一些移位操作来生成随机种子,然后将该种子传递给srand,以生成一小组伪随机数.然后评估伪随机数是否满足谓词函数(更任意的比特抽奖),并输出’*’或’_’.该实验的目的是生成cmov指令,但正如您在下面的反汇编中所看到的,没有.

有关如何更改代码或cflags以便生成它们的任何提示?

#include

#include

#include

#include

bool blackBoxPredicate( const unsigned int& ubref ) {

return ((ubref << 6) ^ (ubref >> 2) ^ (~ubref << 2)) % 15 == 0;

}

int main() {

const unsigned int NUM_RINTS = 32;

unsigned int randomSeed = 1;

unsigned int popCount = 0;

unsigned int * rintArray = new unsigned int[NUM_RINTS];

std::string userString;

std::cout << "input a string to use as a random seed: ";

std::cin >> userString;

std::for_each(

userString.begin(),

userString.end(),

[&randomSeed] (char c) {

randomSeed = (randomSeed * c) ^ (randomSeed << (c % 7));

});

std::cout << "seed computed: " << randomSeed << std::endl;

srand(randomSeed);

for( int i = 0; i < NUM_RINTS; ++i ) {

rintArray[i] = static_cast (rand());

bool pr = blackBoxPredicate(rintArray[i]);

popCount = (pr) ? (popCount+1) : (popCount);

std::cout << ((pr) ? ('*') : ('_')) << " ";

}

std::cout << std::endl;

delete rintArray;

return 0;

}

并使用此makefile来构建它:

OUT=cmov_test.exe

ASM_OUT=cmov_test.asm

OBJ_OUT=cmov_test.obj

SRC=cmov_test.cpp

THIS=makefile

CXXFLAGS=/nologo /EHsc /arch:SSE2 /Ox /W3

$(OUT): $(SRC) $(THIS)

cl $(SRC) $(CXXFLAGS) /FAscu /Fo$(OBJ_OUT) /Fa$(ASM_OUT) /Fe$(OUT)

clean:

erase $(OUT) $(ASM_OUT) $(OBJ_OUT)

然而,当我去看看是否有任何生成时,我看到微软的编译器为最后一个for循环生成了以下程序集:

; 34 : popCount = (pr) ? (popCount+1) : (popCount);

; 35 :

; 36 : std::cout << ((pr) ? ('*') : ('_')) << " ";

00145 68 00 00 00 00 push OFFSET $SG30347

0014a 85 d2 test edx, edx

0014c 0f 94 c0 sete al

0014f f6 d8 neg al

00151 1a c0 sbb al, al

00153 24 cb and al, -53 ; ffffffcbH

00155 04 5f add al, 95 ; 0000005fH

00157 0f b6 d0 movzx edx, al

0015a 52 push edx

0015b 68 00 00 00 00 push OFFSET ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout

00160 e8 00 00 00 00 call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z ; std::operator<<<:char_traits> >

00165 83 c4 08 add esp, 8

00168 50 push eax

00169 e8 00 00 00 00 call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<:char_traits> >

0016e 46 inc esi

0016f 83 c4 08 add esp, 8

00172 83 fe 20 cmp esi, 32 ; 00000020H

00175 72 a9 jb SHORT $LL3@main

供您参考,这是我的cpu id字符串和编译器版本.

PROCESSOR_ARCHITECTURE=x86

PROCESSOR_IDENTIFIER=x86 Family 6 Model 58 Stepping 9, GenuineIntel

PROCESSOR_LEVEL=6

PROCESSOR_REVISION=3a09

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值