2011-10-16 57 views
4

这是希望,一个简单的问题:Linux x86的ASM - 获取用户输入

首先,我想知道是否有人对如何在Linux上使用的x86 NASM语法大会获取用户输入的想法。现在,我有:

section .data 
    greet:  db 'Hello!', 0Ah, 'What is your name?', 0Ah ;simple greeting 
    greetL:  equ $-greet         ;greet length 
    colorQ:  db 'What is your favorite color?'   ;color question 
    colorL:  equ $-colorQ         ;colorQ length 
    suprise1: db 'No way '        
    suprise1L equ $-suprise1 
    suprise3: db ' is my favorite color, too!', 0Ah 

section .bss 
    name:  resb 20          ;user's name 
    color:  resb 15          ;user's color 

section .text 
    global _start 
_start: 

    greeting: 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, greet 
     mov edx, greetL 
     int 80            ;print greet 

    getname: 
     mov eax, 3 
     mov ebx, 0 
     mov ecx, name 
     mov edx, 20 
     int 80            ;get name 

    askcolor: 
     ;asks the user's favorite color using colorQ 

    getcolor: 
     mov eax, 3 
     mov ebx, 0 
     mov ecx, name 
     mov edx, 20 
     int 80 

    thesuprise: 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, suprise1 
     mov edx, suprise1L 
     int 80 

     mov eax, 4 
     mov ebx, 1 
     mov ecx, name 
     mov edx, 20 
     int 80 

     ;write the color 

     ;write the "suprise" 3 

     mov eax, 1 
     mov ebx, 0 
     int 80 

所以它的作用是要求一个名称和颜色,并说,“没办法--name-- --color--是我最喜欢的颜色,也

我需要帮助的是如何在用户输入之后查找上面的“名称”和“颜色”变量的长度,否则,我会在中间产生一堆长长的讨厌空间,因为我只知道最大值尺寸他们可以是我之前声明。

谢谢你的任何和所有帮助。

回答

2

读取系统调用返回在eax寄存器中读取的字节数。如果这个数字是< 0,则会出现某种读取错误。

+0

我试图在读取指令后在eax中使用“返回”的值,但是这没有做任何事情,只是返回我最初声明的缓冲区是多少 – nmagerko

1

您将b e循环读取。

最简单的方法虽然不是最好的,但一次只能读取一个字节,寻找LF(字节10)。

+0

请详细说明。我理解如何阅读用户输入,但是如果我不知道多长时间,我怎么能一次将输入存储为一个字节?此外,我怎么能比较字节10的字符没有某种字符串整数方法? – nmagerko

+0

字节是非常短的整数。 – Joshua

+0

我通常会声明一个长度为80的缓冲区,如果用户超过它,就会抱怨。 – Joshua

1

我知道这是相当古老的,但对于将来看这个的人来说,还有另一种方法来完成OP所要求的,基本上是1行。它可能不是理想的,但对于这样的事情,它应该工作得很好。基本上,不是试图弄清楚用户输入的单词的长度,而是假设他们会输入像'RED'或'ORANGE'等东西。没有花哨的颜色。所以让我们假设最长的颜色会像8个字符。话虽如此,我们可以做到以下几点。

.bss 
    color:  resb  8 

再次,它不理想,但它确实工作,在这种情况下,一些额外的字节不应该影响太多。