无法使用int 80h在nasm中输入内容?

时间:2018-11-16 15:46:53

标签: assembly nasm

基本上,我正在通过这本书来学习汇编语言/鼻语:http://www.pravaraengg.org.in/Download/MA/assembly_tutorial.pdf

在本书中,示例之一是执行以下任务:

  1. 屏幕Please enter a number:上的输出
  2. 要求用户输入数字
  3. 屏幕上显示以下内容:You have entered:1234

下面是脚本:

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 main
 main:
 ;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

我正在https://rextester.com/l/nasm_online_compilerhttps://www.jdoodle.com/compile-assembler-nasm-online

处编译脚本

但是我从来没有输入任何东西,它只是直接输出:Please enter a number: You have entered:

1 个答案:

答案 0 :(得分:0)

在将其链接到32位静态可执行文件之后,在Linux桌面上的终端中运行该文件时,对我有用。

哦,您是从stderr(fd = 2)开始阅读的,而不是stdin(fd = 0)。当我尝试使用echo 123 | ./foo管道输入它时,我注意到了这一点,但它并没有立即退出。 (因为stderr仍然是终端。)我检查了一下,发现实际上是通过使用strace ./foo运行它来完成的。

当它们都在终端上都打开时,这确实起作用,因为传统上stderr是以读/写方式打开的。


dup附近:linux x86 assembly language sys_read call should have first argument as 0 (stdin)