Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在汇编指令中添加变量(asm内联C示例)_C_Assembly_Inline Assembly - Fatal编程技术网

在汇编指令中添加变量(asm内联C示例)

在汇编指令中添加变量(asm内联C示例),c,assembly,inline-assembly,C,Assembly,Inline Assembly,我想执行asm代码行的循环。 实际上,我正在尝试读取我的核心的CPUID,需要读取CPUID的所有参数。 如果我将0写入eax寄存器,那么我将获得制造商名称,如果我将1写入eax,那么将收到下一组CPUID信息。等等 现在我想执行多达15组asm指令,以获得完整的CPUID输出 例: 无符号整数cpuid_reg[4] __asm__ volatile("mov $1, %eax"); __asm__ volatile("cpuid" : "=a" (cpuid_reg[0]),

我想执行asm代码行的循环。 实际上,我正在尝试读取我的核心的CPUID,需要读取CPUID的所有参数。 如果我将0写入eax寄存器,那么我将获得制造商名称,如果我将1写入eax,那么将收到下一组CPUID信息。等等 现在我想执行多达15组asm指令,以获得完整的CPUID输出

例: 无符号整数cpuid_reg[4]

    __asm__ volatile("mov $1, %eax");
    __asm__ volatile("cpuid" : "=a" (cpuid_reg[0]), "=b" (cpuid_reg[1]), "=c" (cpuid_reg[2]), "=d" (cpuid_reg[3]));
    printf("reg[0] 0x%x , cpuid_reg[1] 0x%x, cpuid_reg[2] 0x%x, cpuid_reg[3] 0x%x\n", cpuid_reg[0], cpuid_reg[1], cpuid_reg[2], cpuid_reg[3]);


    __asm__ volatile("mov $2, %eax");
    __asm__ volatile("cpuid" : "=a" (cpuid_reg[0]), "=b" (cpuid_reg[1]), "=c" (cpuid_reg[2]), "=d" (cpuid_reg[3]));
    printf("cpuid_reg[0] 0x%x , cpuid_reg[1] 0x%x, cpuid_reg[2] 0x%x, cpuid_reg[3] 0x%x\n", cpuid_reg[0], cpuid_reg[1], cpuid_reg[2], cpuid_reg[3]);
我需要一组代码,而不是这两组代码,在其中我可以将0到15写入'eax'寄存器,以获得完整的CPUID数据。
谢谢你的帮助。

你可以阅读类似和的内容


使用编译器内部程序集而不是内联程序集。如果您使用的是
\uuu asm\uuuu volatile
,并且您正在编写的用户空间代码在线程之间不同步,然后
volatile
几乎总是错误的,表明asm块操作数的指定不正确。使用cpuid.h中的
\u get\u cpuid
如何?顺便说一下,要获得最近一次CPU的完整信息,您需要超过15次cpuid调用。对于eax的某些值,您需要在ecx中多次使用具有不同值的cpuid。您可以像普通人一样编写
“=b”(其中[1])
,而不是
*(其中+1)
。但是是的,一个
“a”(code)
输入约束是可行的。
static inline void cpuid(int code, uint32_t *a, uint32_t *d) {
  asm volatile("cpuid":"=a"(*a),"=d"(*d):"a"(code):"ecx","ebx");
}

/** issue a complete request, storing general registers output as a string
 */
static inline int cpuid_string(int code, uint32_t where[4]) {
  asm volatile("cpuid":"=a"(*where),"=b"(*(where+1)),
               "=c"(*(where+2)),"=d"(*(where+3)):"a"(code));
  return (int)where[0];
}