Как изменить этот ассемблерный код Linux на совместимый ассемблерный код UNIX? - PullRequest
0 голосов
/ 12 июня 2011

Я хочу изменить этот следующий ассемблерный код на UNIX-совместимый код без использования ядра (или системного вызова) linux.(int $ 0x80)

Этот код для 32-разрядной платформы Intel 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

спасибо,

Ответы [ 2 ]

3 голосов
/ 12 июня 2011

Предложение: написать программу на C с встроенной сборкой.Вы также можете вызывать функции библиотеки C (например, printf) из вашей сборки, чтобы удалить зависимость от ОС.

Вот пример со встроенной сборкой: http://softpixel.com/~cwright/programming/simd/cpuid.php

2 голосов
/ 12 июня 2011

На уровне сборки не существует такого понятия, как «UNIX-совместимый код».Каждый Unix имеет свой собственный интерфейс для выполнения системных вызовов.

Хотя я могу рассказать вам, что делает этот код.Он вызывает инструкцию CPUID, затем помещает результат в часть «xxx» строки output, затем вызывает:

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 ожидает, что системные вызовы будут работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...