首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

linux-这句汇编如何了? [不求甚解]

2013-11-29 
linux--这句汇编怎么了? [不求甚解]只会单句一行行读汇编,整体一块就不懂了,更别说看出什么错误了,关注下。

linux--这句汇编怎么了? [不求甚解]

只会单句一行行读汇编,整体一块就不懂了,更别说看出什么错误了,关注下。
[解决办法]
汇编部分参数前应该是俩个冒号吧,后面的参数是输出部,不是输入部
[解决办法]

// get_cpu_id.cpp
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <arpa/inet.h>

bool get_cpu_id_by_asm()
{
    unsigned int s1 = 0;
    unsigned int s2 = 0;
/*
    asm volatile
    (
        "movl $0x01, %%eax; \n\t"
        "xorl %%edx, %%edx; \n\t"
        "cpuid; \n\t"
        "movl %%edx, %0; \n\t"
        "movl %%eax, %1; \n\t"
        : "=m"(s1), "=m"(s2)
    );
*/
    char cpu[32] = { 0 };
    snprintf(cpu, sizeof(cpu), "%08X%08X", htonl(s2), htonl(s1));
    printf("cpu id: [%s]\n", cpu);

    return(true);
}

这样写镶入汇编实在看不懂
我知道的格式是

_asm
{
  mov eax,funcode  //cpuid的功能码
  cpuid 
  //eax ebx ecx edx 输出相关信息


}

这个指令功能非常多,lz可以参见
http://download.csdn.net/detail/lostspeed/5815827
[解决办法]
你第一种写法,开-O1以后,是不是一样会报错?

我估计是你asm代码里硬编码使用eax而没有reserve导致的问题。
[解决办法]
汇编语法如果没有问题的话,C code中: char cpu[32] = { 0 };  需要放在asm{}前面。
[解决办法]
现代操作系统ebx需要被保护起来,其实后面的帧指针寄存器不是xBP了,而是xBX(这里的x是指32位下的e或64位下的r)。
所以你需要在这段汇编之前加上push %%ebx,最后一句加pop %%ebx
[解决办法]
搜“gcc-inline-asm.pdf”
[解决办法]
http://www.baidu.com/s?wd=cpuid%E6%8C%87%E4%BB%A4&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=4&rsv_sug=0&rsv_sug1=4&rsv_sug4=264&oq=CPUID&rsp=6&f=3&rsv_sug2=1&rsv_sug5=0&inputT=4344
linux-这句汇编如何了? [不求甚解]
[解决办法]
奉劝帖主不要把有限的生命浪费在无限的加密解密死循环中!

[解决办法]
linux-这句汇编如何了? [不求甚解]

热点排行