Как узел IO выполняется для текстовых материалов?

StackOverflow https://stackoverflow.com//questions/12649851

  •  11-12-2019
  •  | 
  •  

Вопрос

Я хочу понять, как сделать базовый ввод / вывод, чтобы написать текстовую игру в сборке X86, просто ради изучения набора инструкций и внутренних органов.

Я не хочу использовать stdlib.h или stdio.hIn мой код сборки, если оно не включает в себя что-то сложное, как printf, который я бы позвонил из сборки.

Я хотел бы узнать, как эмулировать enums и структуру, если это возможно.Функции писания AFAIK и отправки по ним навыки - это просто случай нажимания / появления определенных регистров и выключения стека и / или манипулирования генеракодицетагкодом с использованием кратных 4.

Как бы я сделал это в x86, используя синтаксис Intel?

<Сильное> Обновление

Извините, я забыл указать цель - я использую Linux.


Пример код - функция прототипов реализации прототипы, опущенная для краткости

#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;
}
.

Это было полезно?

Решение

на приложениях Linux, все ввод / вывод выполняется через СИЧЕСКИМИ (которые из приложения Точка зрения, представляют собой элементарные операции, обычно реализованные через инструкцию машины для коммутации в режиме, такие как SYSENTER, GeneracodicCode, SYSCALL ...). Я предлагаю читать чтение Сборка Linux Howto .

См. Также Это и что отвечает.

Посмотрите на вывод компилятора, используя INT. Вы узнаете, что вызов для gcc -Wall -fverbose-asm -O -S your-c.c или любой функции C представляет собой (на X86 в 32 битах) нажатия аргументов в стеке (на X86-64 некоторые аргументы передаются в регистры). Есть некоторые Звонительные конвенции , E.g. Определены (для X86-64) в x86-64 abi Подобный документ существует для других архитектур). R printf - это просто способ определить некоторые константы. A c enum - это просто совокупная зона памяти с данными внутри и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top