【问题标题】:Linux x86 ASM - Getting User Input [duplicate]Linux x86 ASM - 获取用户输入 [重复]
【发布时间】:2011-10-16 22:47:38
【问题描述】:

希望这是一个简单的问题:

首先,我想知道是否有人知道如何在 Linux 上使用 x86 NASM Syntax Assembly 获取用户输入。现在,我有:

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-- 也是我最喜欢的颜色。

我需要帮助的是如何找到上面的“名称”和“颜色”变量在用户输入它们之后的多长时间。否则,我会得到一堆长而讨厌的空格,因为我只知道它们可以是我之前声明的最大尺寸。

感谢您的所有帮助。

【问题讨论】:

标签: linux assembly nasm


【解决方案1】:

read 系统调用返回在 eax 寄存器中读取的字节数。如果此数字

【讨论】:

  • 我尝试在读取指令后在 eax 中使用“返回”的值,但这只会返回我最初声明缓冲区的数量
【解决方案2】:

您将在循环中调用 read。

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

【讨论】:

  • 请详细说明。我了解如何读取用户输入,但是如果我不知道输入的长度,我怎么能一次存储一个字节呢?另外,如何将字节 10 与没有某种字符串到整数方法的字符进行比较?
  • 字节是非常短的整数。
  • 我通常声明一个长度为 80 的缓冲区,如果用户超过它会抱怨。
  • 一次读取一个字符需要禁用规范化(字符缓冲直到按下返回)。这当然是可行的,但并不容易。
  • 等等,什么?这相当于在循环中调用 getc(stdin) 而不在用户空间中缓冲。
【解决方案3】:

我知道这已经很老了,但是对于将来看到这个的人来说,还有另一种方法可以完成 OP 的要求,基本上只有 1 行。它可能并不理想,但对于这样的事情,它应该可以正常工作。基本上,与其试图找出用户输入的单词的长度,不如假设他们要输入“RED”或“ORANGE”等内容。没有花哨的颜色。所以让我们假设最长的颜色会像 8 个字符。话虽如此,我们可以做到以下几点。

.bss 
     color:     resb     8

同样,它并不理想,但它确实有效,在这种情况下,一些额外的字节不应该对其产生太大影响。

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2015-07-30
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多