【问题标题】:How to change this linux Assembly code into compatible UNIX assembly code?如何将此 linux 汇编代码更改为兼容的 UNIX 汇编代码?
【发布时间】:2011-09-13 04:30:58
【问题描述】:

我希望在不使用 linux 内核(或系统?)调用的情况下将以下汇编代码更改为 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

谢谢,

【问题讨论】:

  • 任何时候你在谈论汇编,你都需要指定 CPU 架构。明确的。即使是 x86。
  • 谢谢,我补充说,它的英特尔奔腾平台
  • 哪个 Unix?为什么你认为它们都有兼容的系统调用约定?还是汇编程序?

标签: linux unix assembly x86


【解决方案1】:

建议:编写一个 C 程序,内联汇编。您还可以从您的程序集中调用 C 库函数(如 printf),以消除对操作系统的依赖。

这是一个内联汇编的例子:http://softpixel.com/~cwright/programming/simd/cpuid.php

【讨论】:

  • 谢谢,我刚开始学习汇编。我将研究内联汇编。 (这是否只是意味着将部分汇编代码放入 C 源文件?)
  • +1。由于没有用于汇编的标准库,因此最好的选择是调用 c 库。您需要做的就是将第一个 int 更改为输出函数(例如 printf),将第二个 int 更改为退出调用。
  • @BeyondSora:是的,这就是大部分内容。确切的语法取决于您的 C 编译器,但您可以调用汇编指令并使用 C 变量的名称。对于这种情况,您可以调用cpuid,然后使用mov 将结果从cpuid 放置它们的特定寄存器传输到C 变量中。
  • 嗯,我明白你的意思。但我不知道如何做到这一点,我正在阅读的书并没有太多关于内联汇编的内容。如何将此代码集成到 C 程序中。或者,如何在汇编代码中调用 C 函数?谢谢!
  • 在这里我遇到了构建自己的例子的麻烦:-)
【解决方案2】:

在汇编级别,没有“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 期望系统调用如何工作。

【讨论】:

  • 谢谢!我正在尝试在 Windows SUA(unix 应用程序的子系统)上运行我的代码,我不确定它是如何实现系统调用的。谷歌“SUA 系统调用”没有返回太多有用的信息...
  • @BeyondSora:在这种情况下,不要担心调用系统调用。只需弄清楚如何使用 Micosoft Visual Studio 调用 cpuid。 This sample code 似乎是相关的。
  • 如果它只是调用 CPUID 指令然后调用printf(或类似的),是的。您的目标只是调用CPUID with eax equal to 0
  • 非常感谢!我现在就试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多