下面是一个在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; 

解决方案 »

  1.   

    你直接把star和end输出出来看看。后面那个减法你也用汇编写,也真不怕累。
      

  2.   

    估计空循环在release模式下被优化掉了,你关闭优化,或者用debug版试试
    如果还有问题就说明你的汇编做的减法有问题
    下面是我的测试代码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
      

  3.   

    中间的空操作很可能被编译器优化掉了
    将编译器的优化选项该成disabled或者debug模式
      

  4.   

    好像感觉原代码有点问题,没有计算借位.__asm
    {
    RDTSC   // 计算计算机开始到现在为止运行的时钟总数,高32bit装入edx,低32bit装入eax
    sub eax, LowStart
    sbb edx, HighStart
    jb  L2
    jmp L1
    L1:
     // 正确的
    L2:
     // 错误的.
    }
      

  5.   

    好像感觉原代码有点问题,没有计算借位.__asm
    {
    RDTSC   // 计算计算机开始到现在为止运行的时钟总数,高32bit装入edx,低32bit装入eax
    sub eax, LowStart
    sbb edx, HighStart
    jb  L2
    jmp L1
    L1:
     // 正确的
    L2:
     // 错误的.
    }