Domanda

Sto cercando di capire come fare input / output di base per scrivere un gioco basato su testo in assemblaggio X86, semplicemente per il bene dell'apprendimento del set di istruzioni e degli interni.

Non voglio usare stdlib.h o stdio.hin il mio codice di assemblaggio a meno che non implica qualcosa complicato come printf, che chiamò quindi da Assembly.

Mi piacerebbe imparare come emulare enumums e strisce se possibile.Le funzioni di scrittura AFAIK e l'invio di parametri sono solo un caso di spingere / schioccare registri specifici accese e spegnere lo stack e / o manipolare esp utilizzando multipli di 4.

Come farei questo in X86 usando Intel Sintassi?

Aggiornamento

Scusa, ho dimenticato di specificare il bersaglio - sto usando linux.


.

Esempio codice - Funzione Prototipo Implementazione omessa per motivi di Brevity

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

È stato utile?

Soluzione

su applicazioni Linux, tutto I / O è fatto attraverso Syscalls (che dall'applicazione Punto di vista, sono operazioni elementari, solitamente implementate attraverso un'istruzione macchina a commutazione della modalità come SYSENTER, SYSCALL, INT ...). Suggerisco di leggere il Assembly Linux Howto .

Vedi anche Questo e che risposte.

Guarda l'uscita del compilatore, utilizzando gcc -Wall -fverbose-asm -O -S your-c.c. Imparerai che una chiamata a printf oa qualsiasi funzione C è (su x86 in 32 bit) spingendo argomenti sullo stack (su x86-64 Alcuni argomenti sono passati nei registri). Ci sono alcuni Chiamando Convenzioni , ad es. Quelli definiti (per x86-64) in x86-64 abi (a Documento simile esiste per altre architetture). A C enum è solo un modo per definire alcune costanti. A c struct è solo un aggregato I.e. Una zona di memoria con dati all'interno ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top