Linux 使用NASM获取用户输入时遇到问题

Linux 使用NASM获取用户输入时遇到问题,linux,nasm,windows-subsystem-for-linux,sasm,Linux,Nasm,Windows Subsystem For Linux,Sasm,我在自学NASM,在获取用户输入时遇到了一些问题。(我已经知道MIPS,并且熟悉x86)。起初,我尝试使用示例代码的在线编译器,但尽管它打印到了屏幕上,但实际上从未暂停请求输入。在运行之前,我尝试在stdin窗口中输入一个数字,但这也不起作用 接下来我试着直接从linux运行它,所以我安装了NASM(我使用的是Ubuntu,linux的Windows子系统),但在编译并获得可执行文件后,它在第一次系统调用时就退出了,没有打印或请求输入。我试着在我的虚拟机(Ubuntu 14.04)上运行,但是我

我在自学NASM,在获取用户输入时遇到了一些问题。(我已经知道MIPS,并且熟悉x86)。起初,我尝试使用示例代码的在线编译器,但尽管它打印到了屏幕上,但实际上从未暂停请求输入。在运行之前,我尝试在stdin窗口中输入一个数字,但这也不起作用

接下来我试着直接从linux运行它,所以我安装了NASM(我使用的是Ubuntu,linux的Windows子系统),但在编译并获得可执行文件后,它在第一次系统调用时就退出了,没有打印或请求输入。我试着在我的虚拟机(Ubuntu 14.04)上运行,但是我的虚拟机非常慢,所以我尽量避免使用它。你知道为什么它会在那里工作,但不会在我的子系统上工作吗

我决定尝试切换到IDE(我习惯于使用Mars进行MIPS)并安装SASM,它似乎可以工作,只是它们有一个单独的用户输入窗口,而不是在程序运行时请求输入。我发现的大多数在线编译器也有这样的功能,我有点不明白为什么会有这样的功能。我想写一个简单的hangman程序,让自己熟悉NASM,但在运行程序之前输入输入信息并不管用

任何帮助都将不胜感激,我不知道为什么虚拟机工作,但WSL不工作,我真的不想使用我的虚拟机,因为我的笔记本电脑很旧,速度非常慢

谢谢大家!

我最初运行的代码是:

section .data                           ;Data segment
   userMsg db 'Please enter a number: ' ;Ask the user to enter a number
   lenUserMsg equ $-userMsg             ;The length of the message
   dispMsg db 'You have entered: '
   lenDispMsg equ $-dispMsg                 

section .bss           ;Uninitialized data
   num resb 5

section .text          ;Code Segment
   global _start

_start:                ;User prompt
   mov eax, 4
   mov ebx, 1
   mov ecx, userMsg
   mov edx, lenUserMsg
   int 80h

   ;Read and store the user input
   mov eax, 3
   mov ebx, 2
   mov ecx, num  
   mov edx, 5          ;5 bytes (numeric, 1 for sign) of that information
   int 80h

   ;Output the message 'The entered number is: '
   mov eax, 4
   mov ebx, 1
   mov ecx, dispMsg
   mov edx, lenDispMsg
   int 80h  

   ;Output the number entered
   mov eax, 4
   mov ebx, 1
   mov ecx, num
   mov edx, 5
   int 80h  

   ; Exit code
   mov eax, 1
   mov ebx, 0
   int 80h
使用以下工具进行编译:

nasm -f elf64 test.asm
ld test.o -o test
然后运行:

./test
uname-m在子系统上的输出:(在VM上相同)

子系统上的文件测试输出:(在VM上相同)


编辑:所以我想出来了!WSL根本不支持32位,您必须使用。我一直在问这个问题,因为有人可能会发现它很有用,我也很困惑,为什么输入在在线编译器上不起作用,为什么大多数在线编译器和用于NASM的IDE都有一个单独的stdin输入窗口

正如您在自己的评论中所说,您的问题是wsl中缺少32位系统调用(int 80)支持

使用binfmt和qemu static,您可以从其他linux目标运行二进制文件。qemu static所做的是在用户模式下模拟指令集(i386在x86上不需要太多模拟),但将系统调用转换为内核本机使用的系统调用

我试着在我的虚拟机(Ubuntu 14.04)上运行,这确实有效(耶!),但我的 虚拟机真的很慢,所以我尽量避免使用它。。。。有什么帮助吗 如果您愿意,我不知道为什么虚拟机可以工作,但WSL不能 我真的不想使用我的虚拟机,因为我的笔记本电脑很旧,而且很旧 超慢

这在您的情况下应该非常有效,因为至少对于64位x86上的32位x86,它的速度非常快,因为它是一个非常薄的层

对于wsl来说,它最初是在有人想要的时候探索的,但作为一个副作用,它也可以在32位x86模式下工作

。这是相当简单和容易做到的

在qemu关于的文档中可以找到一些附加信息

有了它,您不仅可以尝试32bit&nasm,还可以对其他指令集(如您已经知道的mips)采用这种方法,或者学习一些arm、sparc、ppc

x86_64
test: ELF 64-bit LSB executeable, x86-64, version 1 (SYSV), statically linked, not stripped