Linux x86 ASM - получение пользовательского ввода - PullRequest
4 голосов
/ 17 октября 2011

Надеюсь, это простой вопрос:

Во-первых, я хотел бы знать, есть ли у кого-нибудь идея, как получить пользовательский ввод, используя синтаксическую сборку x86 NASM в Linux.Прямо сейчас у меня есть:

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-- мой любимый цвет тоже.

Мне нужна помощь в том, чтобы узнать, как долго переменные «name» и «color» выше после того, как пользователь вводит их, в противном случае я получаю кучу длинных, неприятных пробелов между ними, потому что я толькознаю, что максимальный размер, который они могут быть, - это то, что я объявил ранее.

Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Системный вызов read возвращает количество байтов, прочитанных в регистре eax. Если это число <0, произошла какая-то ошибка чтения. </p>

1 голос
/ 12 февраля 2016

Я знаю, что это довольно старо, но для любого, кто задумается об этом в будущем, есть другой способ выполнить то, о чем просит ОП, в основном с 1 строкой.Это не может быть идеальным, но для чего-то подобного это должно работать нормально.По сути, вместо того, чтобы пытаться выяснить длину слова, которое вводит пользователь, давайте просто предположим, что они собираются ввести что-то вроде 'RED' или 'ORANGE' и т. Д., Никаких причудливых цветов. Итак, давайте предположим, что самое длинноецвет будет как 8 символов.При этом мы можем сделать следующее.

.bss 
     color:     resb     8

Опять же, это не идеальный вариант, но он работает, и в этом случае несколько лишних байтов не должны оказывать слишком сильного влияния.

1 голос
/ 17 октября 2011

Вы будете вызывать чтение в цикле.

Самый простой способ, хотя и не самый лучший, - это читать по одному байту за раз, ища LF (байт 10).

...