[英]Add variable in assembly instruction (asm inline C example)
我想執行循環匯編代碼行。 實際上我正在嘗試讀取內核的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%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]);
代替這兩組代碼,我需要一組代碼,可以在其中向eax寄存器寫入0到15,以獲取完整的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];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.