2012-09-29 2 views
1

저는 명령 집합과 내부를 배우기 위해 x86 입출력에서 텍스트 기반 게임을 작성하기 위해 기본 입출력을 수행하는 방법을 알고 싶습니다.텍스트 기반 작업을 위해 어셈블리 IO가 어떻게 수행됩니까?

printf과 같은 복잡한 내용이 포함되어 있지 않으면또는 stdio.h을 내 어셈블리 코드에 사용하고 싶지 않습니다. 그런 다음 어셈블리에서 호출해야합니다.

가능한 경우 열거 형 및 구조체를 에뮬레이트하는 방법을 배우고 싶습니다. AFAIK 함수를 작성하고 매개 변수를 전송하는 것은 특정 레지스터를 스택으로 밀어 넣거나 튕기거나 또는 esp을 4의 배수로 조작하는 경우 일뿐입니다.

intel 구문을 사용하여 x86에서 어떻게합니까?

죄송합니다

업데이트, 나는 대상을 지정하는 것을 잊었다 - 나는 리눅스를 사용하고 있습니다.


예제 코드 - 간결함을 위해 생략 기능 프로토 타입 구현 리눅스 응용 프로그램에

#include <stdio.h> 
#include <stdlib.h> 

typedef enum __weapon_type__ { 

    weapon_type_sword = 1, 
    weapon_type_spear = 2, 
    weapon_type_knife = 3 

} weapon_type; 

typedef struct __weapon__ { 

    unsigned int damage; 
    char*  name; 
    weapon_type type; 

} weapon; 

weapon* weapon_create(int damage, char* name, weapon_type type); 

void putline(const char* msg); 

int main(int argc, char** argv) 
{ 
    unsigned int weapon_selection, weapon_damage; 
    weapon_type weptype; 
    weapon* player_weapon = NULL; 
    char* weapon_name = NULL; 

    putline("Choose your weapon type:\t"); 
    putline("(1) Sword"); 
    putline("(2) Spear"); 
    putline("(3) Knife"); 

    while (weapon_selection > 3 || weapon_selection < 1) 
    { 
     scanf("%u", &weapon_selection); 

     switch(weapon_selection) 
     { 
      case 1: 
       weptype = weapon_type_sword; 
       break; 
      case 2: 
       weptype = weapon_type_spear; 
       break; 
      case 3: 
       weptype = weapon_type_knife; 
       break; 
      default: 
       putline("ERROR! Please select options 1 - 3\t"); 
       break; 
     } 
    } 

    /*do the same thing for weapon_damage and weapon_name, etc. 
     Then ask for player name, type of character, blah blah blah. 
    */ 

    player_weapon = weapon_create(weapon_damage, weapon_name, weptype); 

    return 0; 
} 
+0

C 코드를 ASM으로 컴파일하고 보려고 했습니까? –

+0

그 생각은 유일한 문제는 구현의 관점에서 코드의 IO 측면 (필자가 틀린 경우가 아니라면)을 다루지 않는다는 것입니다. 즉, C 라이브러리에 대한 extern 호출을 수행하지 않을까요? – zeboidlund

+0

IO는 플랫폼에 종속적입니다. 궁극적으로 코드는 Linux/DOS/Windows/다른 대상에 따라 다르므로 OS 기능을 호출해야합니다. 기본적으로 텍스트를 출력하는 OS 함수를 배우고 Asm에서 OS 함수를 호출하는 방법을 배워야 할 필요가있는 것처럼 보입니다. 정확히 대상을 지정하면 다른 사람이 질문에 대답 할 수있게됩니다. –

답변

1

, 모두 내가/O는보기의 응용 지점에서, 초등학교입니다 syscalls (를 통해 이루어집니다 일반적으로 SYSENTER, SYSCALL, INT ...와 같은 모드 전환 기계 명령어를 통해 구현됩니다. linux assembly howto을 읽는 것이 좋습니다.

thisthat 답장을 참조하십시오.

gcc -Wall -fverbose-asm -O -S your-c.c을 사용하여 컴파일러의 출력을보십시오. printf 또는 모든 C 함수에 대한 호출이 스택에 인수를 푸시 (x86-64에서는 일부 인수가 레지스터에 전달됨)된다는 것을 알 수 있습니다. calling conventions이 있습니다. x86-64 ABI (다른 아키텍처의 경우 비슷한 문서)에 정의 된 (x86-64의 경우) A enum은 몇 가지 상수를 정의하는 방법 일뿐입니다. A struct은 집합체 일뿐입니다. 예를 들어 내부에 데이터가있는 메모리 영역 일 수 있습니다.

관련 문제