2011-06-11 6 views
0

리눅스 커널 (또는 시스템?) 호출을 사용하지 않고이 어셈블리 코드를 UNIX 호환 코드로 변경하고 싶습니다. (INT의 $ 0x80을)이 Linux 어셈블리 코드를 호환되는 UNIX 어셈블리 코드로 변경하는 방법은 무엇입니까?

이 코드는

#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 

감사 & T의 구문을 작성, 인텔 32 비트 펜티엄 플랫폼입니다,

+2

어셈블리에 관해 이야기 할 때마다 CPU 아키텍처를 지정해야합니다. 명시 적으로. x86 일지라도. –

+0

고마워, 나는 인텔 펜티엄 플랫폼 –

+1

을 추가 했는가? 어느 유닉스인가? 왜 그들은 모두 호환 시스템 호출 규칙을 가지고 있다고 가정합니까? 또는 조립업자, 그 문제에 관해서? – wnoise

답변

3

제안 : 인라인 어셈블리와 C 프로그램을 작성합니다. 또한 OS 종속성을 제거하기 위해 어셈블리에서 C 라이브러리 함수 (예 : printf)를 호출 할 수 있습니다. "UNIX 호환 코드 '같은 건 없다, 어셈블리 수준에서 http://softpixel.com/~cwright/programming/simd/cpuid.php

+0

감사합니다, 방금 어셈블리를 배우기 시작했습니다. 인라인 어셈블리를 살펴 보겠습니다. (단지 어셈블리 코드의 일부를 C 소스 파일에 넣는 것을 의미합니까?) –

+0

+1. 어셈블리를위한 표준 라이브러리가 없기 때문에 가장 좋은 방법은 c 라이브러리를 호출하는 것입니다. 첫 번째 int를 출력 함수 (예 : printf)로 변경하고 두 번째 int를 exit (종료)로 변경하면됩니다. – ughoavgfhw

+0

@BeyondSora : 네, 그게 대부분입니다. 정확한 구문은 C 컴파일러에 따라 다르지만 어셈블리 명령어를 호출하고 C 변수의 이름을 사용할 수도 있습니다. 이 경우'cpuid'를 호출 한 다음'cpuid'가있는 특정 레지스터의 결과를 C 변수에 전송하기 위해'mov'를 사용할 수 있습니다. –

2

:

다음은 인라인 어셈블리와 예입니다. 모든 유닉스에는 시스템 호출을위한 자체 인터페이스가 있습니다.

이 코드가 무엇을하고 있는지 말할 수 있습니다. 그런 다음 호출, 다음 output 문자열의 "XXX"부분에 결과를두고, CPUID 명령을 호출 :

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 구문을 배우려면 설명서를 참조해야합니다.

어셈블리에서 직접 이것을 직접 호출하려는 경우 특정 유닉스에서 시스템 호출이 어떻게 작동하는지 기대해야합니다.

+0

감사합니다! Windows SUA (UNIX 응용 프로그램 용 하위 시스템)에서 코드를 실행하려고하는데 시스템 호출을 구현하는 방법을 잘 모르겠습니다. Google SUA 시스템 호출은 유용한 정보를 반환하지 않습니다. –

+0

@BeyondSora :이 경우 시스템 호출을 호출하는 것에 대해 걱정하지 마십시오. Micosoft Visual Studio를 사용하여'cpuid '를 호출하는 방법을 알아 내십시오. [이 샘플 코드] (http://msdn.microsoft.com/en-us/library/xs6aek1h(v=80) .aspx)는 관련성이있는 것으로 보입니다. – Nemo

+0

SUA에서 실행됩니까? –

관련 문제