[英]How to change this linux Assembly code into compatible UNIX assembly code?
我希望在不使用 linux kernel(或系统?)调用的情况下将以下汇编代码更改为 UNIX 兼容代码。 (int $0x80)
此代码适用于 Intel 32 位 Pentium 平台,使用 AT&T 语法编写
#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 期望系统调用如何工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.