1

命令セットと内部を学習するためだけに、x86アセンブリでテキストベースのゲームを作成するための基本的な入出力の方法を理解したいと思っています。

のような複雑なものが含まれていない限り、stdlib.hまたはアセンブリコードで使用したくありません。その後、アセンブリから呼び出します。stdio.hprintf

可能であれば、列挙型と構造体をエミュレートする方法を学びたいです。AFAIKの関数の書き込みとパラメータの送信は、特定のレジスタをスタックにプッシュ/ポップしたりesp、4の倍数を使用して操作したりする場合にすぎません。

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;
}
4

1 に答える 1

1

Linux アプリケーションでは、すべての I/O はsyscallを介して行われます (アプリケーションの観点からは、syscall は基本的な操作であり、通常はSYSENTERSYSCALLINT... などのモード切り替えマシン命令を介して実装されます)。Linux アセンブリのハウツーを読むことをお勧めします。

これその答えも参照してください。

を使用して、コンパイラの出力を確認しgcc -Wall -fverbose-asm -O -S your-c.cます。printf任意の C 関数の呼び出しが (x86 では 32 ビットで) 引数をスタックにプッシュすることを学習します (x86-64 では、いくつかの引数はレジスターで渡されます)。x86-64 ABIで (x86-64 用に) 定義されているものなど、いくつかの呼び出し規約があります(他のアーキテクチャ用の同様のドキュメントが存在します)。ACは、いくつかの定数を定義する方法にすぎません。ACは単なる集合体、つまり内部にデータを含むメモリ ゾーンなどです。enumstruct

于 2012-09-29T06:23:22.333 に答える