基本上,我正在通过这本书来学习汇编语言/鼻语:http://www.pravaraengg.org.in/Download/MA/assembly_tutorial.pdf
在本书中,示例之一是执行以下任务:
Please enter a number:
上的输出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:
答案 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)