Linux 如何为基于文本的内容执行汇编IO?

Linux 如何为基于文本的内容执行汇编IO?,linux,nasm,stdio,text-based,Linux,Nasm,Stdio,Text Based,我希望了解如何进行基本的输入/输出,以便在x86汇编中编写基于文本的游戏,只是为了学习指令集和内部结构 我不想在汇编代码中使用stdlib.h或stdio.hin,除非它涉及一些复杂的东西,比如printf,然后我会从汇编中调用它 如果可能的话,我想学习如何模拟枚举和结构。AFAIK写入函数并向其发送参数只是将特定寄存器推上/弹出堆栈和/或使用4的倍数操纵esp的一种情况 在x86中如何使用intel语法实现这一点 更新 对不起,我忘了指定目标-我正在使用Linux 为了简洁起见,省略了示例代码

我希望了解如何进行基本的输入/输出,以便在x86汇编中编写基于文本的游戏,只是为了学习指令集和内部结构

我不想在汇编代码中使用stdlib.h或stdio.hin,除非它涉及一些复杂的东西,比如printf,然后我会从汇编中调用它

如果可能的话,我想学习如何模拟枚举和结构。AFAIK写入函数并向其发送参数只是将特定寄存器推上/弹出堆栈和/或使用4的倍数操纵esp的一种情况

在x86中如何使用intel语法实现这一点

更新

对不起,我忘了指定目标-我正在使用Linux

为了简洁起见,省略了示例代码-函数原型实现


在Linux应用程序上,所有I/O都是通过基本操作来完成的,从应用程序的角度来看,这些操作通常是通过模式切换机器指令来实现的,如SYSENTER、SYSCALL、INT。。。。我建议你读这本书

另请参见和答案


使用gcc-Wall-fverbose asm-O-S your-c.c查看编译器的输出。您将了解到,对printf或任何c函数的调用是在x86上以32位在x86-64上的堆栈上推送参数的。一些参数是在寄存器中传递的。有一些,例如,在其他体系结构中存在类似文档中为x86-64定义的。C枚举只是定义某些常量的一种方法。C结构只是一个聚合,即内存区域,其中包含数据等。

在Linux应用程序上,所有i/O都是通过基本操作完成的,从应用程序的角度来看,这些操作都是基本操作,通常通过模式切换机指令(如SYSENTER、SYSCALL、INT…)来实现。。。。我建议你读这本书

另请参见和答案


使用gcc-Wall-fverbose asm-O-S your-c.c查看编译器的输出。您将了解到,对printf或任何c函数的调用是在x86上以32位在x86-64上的堆栈上推送参数的。一些参数是在寄存器中传递的。有一些,例如,在其他体系结构中存在类似文档中为x86-64定义的。C枚举只是定义某些常量的一种方法。C结构只是一个聚合,即内存区域,其中包含数据等。

您是否尝试将C代码编译为ASM并查看它?我想,唯一的问题是它不一定涵盖代码的IO方面,除非我在这里的实现是错误的;i、 例如,它不只是对c库进行外部调用吗?IO依赖于平台-最终代码需要调用OS函数来实现-将根据Linux/DOS/Windows/其他目标而有所不同。基本上,看起来你需要学习操作系统函数来输出文本,以及如何从Asm调用操作系统函数-指定确切的目标可以让人回答这个问题。我更新了我的帖子-谢谢你的建议。你有没有试着将C代码编译成Asm并查看它?我想到了这一点,唯一的问题是它不一定涵盖代码的IO方面,除非我在这里的实现是错误的;i、 例如,它不只是对c库进行外部调用吗?IO依赖于平台-最终代码需要调用OS函数来实现-将根据Linux/DOS/Windows/其他目标而有所不同。基本上,看起来你需要学习操作系统函数来输出文本,以及如何从Asm调用操作系统函数-指定确切的目标可以让人回答这个问题。我更新了我的帖子-谢谢你的建议。
#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;
}