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



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

前任:

        unsigned int 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%xn", 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%xn", cpuid_reg[0], cpuid_reg[1], cpuid_reg[2], cpuid_reg[3]);

代替这两组代码,我需要一组代码,我可以将 0 到 15 写入"eax"寄存器以获取完整的 CPUID 数据。感谢您的帮助。

你可以读到这样和这样的东西

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];
}

相关内容

最新更新