dll工程里的_asm语句为什么不执行

奕诚 2013-12-11 04:21:07
C++Builder 的DLL工程,每次调用GetCPUID函数返回的uCPUID值都是0,是不是没执行_asm里的汇编语句? 该函数在C++Builder一般的工程下可以执行_asm里的语句,能返回正确的uCPUID值。顺便问下,怎么debug调试dll工程?

DWORD GetCPUID(void)
{
DWORD uCPUID = 0U; //UINT

_asm
{
mov eax, 1
cpuid
mov uCPUID, edx
}

return uCPUID;
}

...全文
229 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
奕诚 2013-12-12
  • 打赏
  • 举报
回复
谢谢你还亲自写demo程序哦,不过我这里还是老样子返回0。我试过在汇编里执行jmp指令
_asm
{
mov eax, 1
cpuid
mov uCPUID, edx
jmp show;
}
show: MessageBox(NULL,"_asm","show",MB_OK);
return uCPUID;
能弹框"_asm"是否说明已经执行里面的_asm语句了?但是uCPUID值是0。
就算按你提供的demo程序那样调用也是返回0,我用API获取其他硬件序列号没问题的,就是这个cpuid的汇编这里奇怪。我再摸索下...你的dll工程和调用工程都是C++Builder下的吧。
奕诚 2013-12-12
  • 打赏
  • 举报
回复
引用 11 楼 dragon9098 的回复:
谢谢你还亲自写demo程序哦,不过我这里还是老样子返回0。我试过在汇编里执行jmp指令
_asm
{
mov eax, 1
cpuid
mov uCPUID, edx
jmp show;
}
show: MessageBox(NULL,"_asm","show",MB_OK);
return uCPUID;
能弹框"_asm"是否说明已经执行里面的_asm语句了?但是uCPUID值是0。
就算按你提供的demo程序那样调用也是返回0,我用API获取其他硬件序列号没问题的,就是这个cpuid的汇编这里奇怪。我再摸索下...你的dll工程和调用工程都是C++Builder下的吧。


        BYTE szCPU[16]= {0};
DWORD uCPUID = 0U; //UINT

_asm
{
mov eax, 0
cpuid
mov dword ptr szCPU[0], ebx
mov dword ptr szCPU[4], edx
mov dword ptr szCPU[8], ecx
mov eax, 1
cpuid
mov uCPUID, edx
jmp show;
}
show: MessageBox(NULL,szCPU,"show",MB_OK);


如上,输出的szCPU值是空的。

在一般工程下有值:

ebx:1970169159UL (0x756E6547)
edx:1231384169UL (0x49656E69)
ecx:1818588270UL (0x6C65746E)
sololie 2013-12-12
  • 打赏
  • 举报
回复
看这些代码自然是cb写的了。 另外你把ebx,ecx,edx的值都取出来看看
sololie 2013-12-11
  • 打赏
  • 举报
回复

// project2.dll ,use vcl
extern "C"{
      __declspec(dllexport) __stdcall DWORD  GetCPUID(void);
}

DWORD __stdcall  GetCPUID(void)
{
    DWORD uCPUID = 0U;    //UINT
    _asm
    {
      mov eax, 1
      cpuid
      mov uCPUID, edx
    }

    return uCPUID;
}

// 调用
void __fastcall TForm1::btn1Click(TObject *Sender)
{
    HINSTANCE hInc = LoadLibraryA("Project2.dll");
    DWORD (__stdcall *getcpuid)(void);
    (FARPROC)getcpuid = GetProcAddress(hInc,"GetCPUID");
    if (getcpuid)
    {
       AnsiString sCpuID = AnsiString().sprintf("%u", getcpuid());
       ShowMessage(sCpuID); // 也是3219913727
    }

     FreeLibrary(hInc);
}
sololie 2013-12-11
  • 打赏
  • 举报
回复
引用 7 楼 dragon9098 的回复:
我刚又看了一遍那文章,眼花了,没看见下面的评论“这样得到的不是cpuID, 而是该CPU支持的一些功能,同类型的一样”,果然如老妖所说眼花病得治,呵呵... 先不管是不是cpuID吧,看下为什么没执行汇编语句。 CSDN也有挺多帖子问到获取cpuID的,基本都是使用汇编指令获取。
因为扫一眼看到 mov eax, // 这里有个1看漏了,所以没过脑就认为这句是错的,少了操作数 cpuid .... 我把这函数封装到dll里导出调用,结果一致
sololie 2013-12-11
  • 打赏
  • 举报
回复
我试了下,把这函数塞dll里导出,调用可以返回正确结果
奕诚 2013-12-11
  • 打赏
  • 举报
回复
我刚又看了一遍那文章,眼花了,没看见下面的评论“这样得到的不是cpuID, 而是该CPU支持的一些功能,同类型的一样”,果然如老妖所说眼花病得治,呵呵...
先不管是不是cpuID吧,看下为什么没执行汇编语句。
CSDN也有挺多帖子问到获取cpuID的,基本都是使用汇编指令获取。
奕诚 2013-12-11
  • 打赏
  • 举报
回复
我也不是很清楚CPUID到底有几位,这是我搜索参考的文章:
http://blog.sina.com.cn/s/blog_768552710101dfr1.html
sololie 2013-12-11
  • 打赏
  • 举报
回复
我试过了得到结果是3219913727,cpuid是个这么大的数值?
奕诚 2013-12-11
  • 打赏
  • 举报
回复
先谢谢你的热心回复哈!引用不了你楼上的回复,直接回吧。
mov eax, 1
这句要给eax赋值1的,1表示cpuid命令获取cpuid,0表示获取cpu类型。

C++Builder一般的工程下可以执行_asm里的语句,可以返回正确cpuid值的,你可以试试。我奇怪的是为什么在dll工程里不执行,老是返回0。
补充下,这个函数简单所以只是在dll工程内部调用,不作为导出_export接口函数。我如果将那个函数在一般工程下调用将返回值作为传入参数穿给dll里的接口函数,是没问题的。
sololie 2013-12-11
  • 打赏
  • 举报
回复
给看成了, _asm { mov eax, cpuid mov uCPUID, edx } 果然如老妖所说眼花病得治 另外,这个函数我得出的结果是-1075053569,显然不对,LZ是如何得出正确的结果的?
sololie 2013-12-11
  • 打赏
  • 举报
回复
看漏了前面还有个1。。。
sololie 2013-12-11
  • 打赏
  • 举报
回复
_asm { mov eax, 1 cpuid // cpuid 不要换行写 mov uCPUID, edx }

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧