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

  • 本文关键字:NASM int 80h assembly nasm
  • 更新时间 :
  • 英文 :


基本上我是通过这本书学习汇编语言/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:

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

哦,你读的是stderr(fd=2(,而不是stdin(fd=0(。当我尝试用echo 123 | ./foo将输入管道传输到它时,我注意到了这一点,但它没有立即退出。(因为stderr仍然是终端。(我通过使用strace ./foo运行它来检查实际情况。

当它们都在终端上打开时,这种情况就会发生,因为按照传统,stderr是以读/写方式打开的。


接近dup:linux x86汇编语言sys_read调用的第一个参数应为0(stdin(

相关内容

  • 没有找到相关文章

最新更新