下面是一个在VC++中嵌入汇编的例子,不知道如何调试?
就想看下在VC++中嵌入汇编指令什么效果?
请大家帮忙分析下,谢谢//用汇编实现获取程序运行的时间
//编译通过,但是运行时没有输出
//在命令行下运行,也看不到输出的内容#include <iostream>
#include <windows.h>
using namespace std;void GetClockNumber(long high, long low);
void GetRunTime(); //入口函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow; //获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
} //空等待操作
for(int i= 0; i<100000; i++ )
{
for(int i= 0; i<100000; i++ )
{
}
} //获取代码结束时cpu内部计数器的值,并减去初值
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;获取两次计数器值得差
sub eax, LowStart
cmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
} //把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
//输出代码段运行的时钟周期数
//以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^//没有输出任何结果
cout<< (double) (timer /1.1/1000000000) << endl; return 0;
}
就想看下在VC++中嵌入汇编指令什么效果?
请大家帮忙分析下,谢谢//用汇编实现获取程序运行的时间
//编译通过,但是运行时没有输出
//在命令行下运行,也看不到输出的内容#include <iostream>
#include <windows.h>
using namespace std;void GetClockNumber(long high, long low);
void GetRunTime(); //入口函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow; //获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
} //空等待操作
for(int i= 0; i<100000; i++ )
{
for(int i= 0; i<100000; i++ )
{
}
} //获取代码结束时cpu内部计数器的值,并减去初值
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;获取两次计数器值得差
sub eax, LowStart
cmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
} //把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
//输出代码段运行的时钟周期数
//以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^//没有输出任何结果
cout<< (double) (timer /1.1/1000000000) << endl; return 0;
}
如果还有问题就说明你的汇编做的减法有问题
下面是我的测试代码void checktimer()
{
long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow; //获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
} //空等待操作
for(int i= 0; i <100000; i++ )
{
for(int j= 0; j <100000; j++ )
{
}
} //获取代码结束时cpu内部计数器的值,并减去初值
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
} //把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位 printf("HighStart=%lu\nLowStart=%lu\nHighEnd=%lu\nLowEnd=%lu\n",HighStart,LowStart,HighEnd,LowEnd);
unsigned __int64 begin = (((unsigned __int64)HighStart)<<32) + LowStart;//MAKELONGLONG(LowStart,HighStart);//HighStart; unsigned __int64 end = (((unsigned __int64)HighEnd)<<32) +LowEnd; float time = (end -begin)/3.01/1000000000;//(numhigh <<32) + numlow; printf("begin=%I64u\nend=%I64u\ntime=%f\n",begin,end,time);}int _tmain(int argc, _TCHAR* argv[])
{
DWORD begin = ::GetTickCount(); checktimer(); printf("Ticktime=%d\n",::GetTickCount()-begin); return 0;
}
运行结果HighStart=18558
LowStart=3851048663
HighEnd=18570
LowEnd=3393123717
begin=79705559160535
end=79756640843141
time=16.970659
Ticktime=16985
将编译器的优化选项该成disabled或者debug模式
{
RDTSC // 计算计算机开始到现在为止运行的时钟总数,高32bit装入edx,低32bit装入eax
sub eax, LowStart
sbb edx, HighStart
jb L2
jmp L1
L1:
// 正确的
L2:
// 错误的.
}
{
RDTSC // 计算计算机开始到现在为止运行的时钟总数,高32bit装入edx,低32bit装入eax
sub eax, LowStart
sbb edx, HighStart
jb L2
jmp L1
L1:
// 正确的
L2:
// 错误的.
}