繁体   English   中英

如何将此 linux 汇编代码更改为兼容的 UNIX 汇编代码?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM