如何在 ffi 中使用它
2018-8-25 9:30:48
收藏:0
阅读:101
评论:1
std::string __cpuid()
{
char VendorName[49] = {0};
char VendorID[13] = {0};
unsigned int a, b, c, d;
__asm xor EBX, EBX;
__asm xor ECX, ECX;
__asm xor EDX, EDX;
__asm mov EAX, 0x80000002;
__asm cpuid;
__asm mov a, EAX;
__asm mov b, EBX;
__asm mov c, ECX;
__asm mov d, EDX;
__asm mov DWORD PTR [VendorName + 0], EAX;
__asm mov DWORD PTR [VendorName + 4], EBX;
__asm mov DWORD PTR [VendorName + 8], ECX;
__asm mov DWORD PTR [VendorName + 12], EDX;
__asm mov EAX, 0x80000003;
__asm cpuid;
__asm mov DWORD PTR [VendorName + 16], EAX;
__asm mov DWORD PTR [VendorName + 20], EBX;
__asm mov DWORD PTR [VendorName + 24], ECX;
__asm mov DWORD PTR [VendorName + 28], EDX;
__asm mov EAX, 0x80000004;
__asm cpuid;
__asm mov DWORD PTR [VendorName + 32], EAX;
__asm mov DWORD PTR [VendorName + 36], EBX;
__asm mov DWORD PTR [VendorName + 40], ECX;
__asm mov DWORD PTR [VendorName + 44], EDX;
__asm mov EAX, 0x00000000;
__asm cpuid;
__asm mov DWORD PTR [VendorID + 0], EBX;
__asm mov DWORD PTR [VendorID + 4], EDX;
__asm mov DWORD PTR [VendorID + 8], ECX;
__asm mov EAX, 0x80000004;
strcat(VendorName, " ");
strcat(VendorName, VendorID);
return string(VendorName);
}
各位,如何在 ffi Lua 中使用它?我对 ffi 不太熟悉
我试过使用 ffi.cdef,但编译器报错:在 'std' 附近需要声明说明符
我试过使用很多东西,但我是新手
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

这段代码适用于 LuaJIT x86。
(如果 LuaJIT 使用 MS VisualStudio 构建,则无法运行,需使用 MinGW)
assert(jit.arch ==''x86'') local ffi = require(“ ffi”) local qwords = ffi.typeof(“ uint64_t [?]”) local dwords = ffi.typeof(“ uint32_t *”) - cpuid_EAX_EDX = push EBX / cpuid / pop EBX / ret local cpuid_EAX_EDX = ffi.cast(“ __cdecl uint64_t(*)(uint32_t)”,“ \ x53 \ x0F \ xA2 \ x5B \ xC3”) - cpuid_EBX_ECX = push EBX / cpuid / xchg EAX,ECX / xchg EAX,EDX / xchg EAX,EBX / pop EBX / ret local cpuid_EBX_ECX = ffi.cast(“ __cdecl uint64_t(*)(uint32_t)”,“ \ x53 \ x0F \ xA2 \ x91 \ x92 \ x93 \ x5B \ xC3”) local function cpuid(n) local arr = ffi.cast(dwords,qwords(2,cpuid_EAX_EDX(n),cpuid_EBX_ECX(n))) 返回 ffi.string(arr,4),ffi.string(arr + 2,4),ffi.string(arr + 3,4),ffi.string(arr + 1,4) end local s1 =“” for n = 0x80000002,0x80000004 do local eax,ebx,ecx,edx = cpuid(n) s1 = s1..eax..ebx..ecx..edx end s1 = s1:gsub(“ ^ \ s +”,“”):gsub(“%z + $”,“”) - 删除前导空格和尾随零 local eax,ebx,ecx,edx = cpuid(0) local s2 = ebx..edx..ecx s2 = s2:gsub(“ ^ \ s +”,“”):gsub(“%z + $”,“”) - 删除前导空格和尾随零 print(s1 ..“”.. s2) - Intel(R)Core(TM)i5-3470 CPU @ 3.20GHz GenuineIntel