アセンブリIOはテキストベースのもののためにどのように実行されますか?

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

  •  11-12-2019
  •  | 
  •  

質問

X86アセンブリでテキストベースのゲームを書く方法を理解しています。

stdlib.hのような複雑なものが含まれていない限り、stdio.hまたはprintfinを使用したくない。

可能であれば、列挙型や構造体をエミュレートする方法を学びます。AFAIKの書き込み関数とそれらを送信するパラメータは、スタックの上および/または倍数の倍数を使用して、特定のレジスタをプッシュ/ポップポップする場合の場合だけです。

Intel構文を使用してx86ではどうやって行うのでしょうか。

更新

すみません、ターゲットを指定するのを忘れました - 私は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アプリケーションでは、すべてのI / OはTHRU syscalls (アプリケーションから観点は、通常、SYSENTERSYSCALLINT ...)のようなモードスイッチングマシン命令をスレットして実装されています。 Linuxアセンブリを読むことをお勧めします。

関連項目このあの答え。

gcc -Wall -fverbose-asm -O -S your-c.cを使用して、コンパイラの出力を見てください。 STACK上の引数をプッシュする(x86-64では、x86-64では、1つの引数が渡された場合は、x86-64で)、printfへの呼び出し(32ビットのx86上)の呼び出しがあることを学ぶことができます。いくつかの呼び出し規則、例えば x86-64 abi (a x86-64)で定義されたもの(x86-64)他のアーキテクチャにも同様の文書が存在します。 C enumは、いくつかの定数を定義する方法です。 C structは単なる集約です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top