我希望将以下汇编代码更改为与UNIX兼容的代码,而不使用Linux内核(或系统?)调用。 (int $ 0x80)
此代码适用于采用AT&T语法编写的Intel 32位Pentium平台
#cpuid.s Sample program to extract the processor Vendor ID .section .data output: .ascii “The processor Vendor ID is 'xxxxxxxxxxxx'\n” .section .text .globl _start _start: movl $0, %eax cpuid movl $output, %edi movl %ebx, 28(%edi) movl %edx, 32(%edi) movl %ecx, 36(%edi) movl $4, %eax movl $1, %ebx movl $output, %ecx movl $42, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80
谢谢,
建议:用内联汇编写一个C程序。 您也可以从程序集中调用C库函数(如printf
),以删除操作系统依赖项。
以下是内联汇编的示例: http : //softpixel.com/~cwright/programming/simd/cpuid.php
在汇编级别,没有“UNIX兼容代码”这样的东西。 每个Unix都有自己的接口来进行系统调用。
不过,我可以告诉你这个代码在做什么。 它调用CPUID指令,然后将结果放在output
字符串的“xxx”部分,然后调用:
write(1, output, 42); exit(0);
如果你使用的是GCC,那么最接近的“便携”等价物就像这样:
#include <string.h> #include <stdio.h> int main(int argc, char *argv[]) { int cpuid[3]; char result[12]; asm("cpuid" : "=b" (cpuid[0]), "=d" (cpuid[1]), "=c" (cpuid[2]) : "a" (0L)); memcpy(&result[0], &cpuid[0], 4); memcpy(&result[4], &cpuid[1], 4); memcpy(&result[8], &cpuid[2], 4); printf("The processor Vendor ID is '%s'\n", &result[0]); return 0; }
对于其他C编译器,您将不得不查阅手册以了解其内联asm语法。
如果你真的想在汇编中直接调用这个函数,你将不得不找出你的Unix希望系统调用是如何工作的。