не может ввести что-то в nasm используя int 80h? - PullRequest
0 голосов
/ 16 ноября 2018

По этой книге я изучаю язык ассемблера / * 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_compiler или https://www.jdoodle.com/compile-assembler-nasm-online

, но мне никогда ничего не удается ввести, он просто выводит: Please enter a number: You have entered:

1 Ответ

0 голосов
/ 16 ноября 2018

Работает для меня, когда я запускаю его в терминале на моем рабочем столе Linux, после связывания его с 32-битным статическим исполняемым файлом.

О, вы читаете из stderr (fd= 2), а не stdin (fd = 0) .Я заметил это, когда попытался передать входные данные с помощью echo 123 | ./foo, и он не сразу вышел.(потому что stderr по-прежнему является терминалом.) Я проверил, что на самом деле происходит, запустив его с strace ./foo.

Это работает, когда они оба открыты на терминале, потому что по традиции stderrОткрыто для чтения / записи.


возле dup: Язык ассемблера linux x86 У вызова sys_read должен быть первый аргумент в виде 0 (stdin)

...