2011-10-16 1 views
4

얻기 이것은 간단한 질문은 희망입니다. 바로 지금, 내가 가진 :리눅스 86 ASM 사용자 입력

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

나는 read 명령어 다음에 eax에서 "returned"값을 사용하려고 시도했지만 이것은 원래 버퍼를 얼마만큼 선언했는지 리턴한다. – nmagerko

1

당신은 것입니다 b e 루프에서 읽기를 호출합니다.

가장 쉬운 방법은 LF (바이트 10)를 찾으면서 한 번에 한 바이트 씩 읽는 것입니다.

+0

자세히 설명해주세요. 사용자 입력을 읽는 방법을 이해하지만 얼마나 오랫동안 입력해야하는지 모를 경우 어떻게 한 번에 한 바이트 씩 입력을 저장할 수 있습니까? 또한 정수 메소드에 문자열을 사용하지 않고 바이트 10을 문자와 어떻게 비교할 수 있습니까? – nmagerko

+0

바이트는 매우 짧은 정수입니다. – Joshua

+0

나는 보통 길이가 80 인 버퍼를 선언하고 사용자가 그것을 초과하면 불평한다. – Joshua

1

나는 이것이 꽤 오래되었다는 것을 알고있다. 그러나 미래에 이것을 바라는 누군가를 위해, OP가 요구하는 것을 달성하는 또 다른 방법이있다. 기본적으로 1 줄이다. 이상적이지 않을 수도 있지만, 이와 같은 경우 잘 작동합니다. 기본적으로 사용자가 입력하는 단어의 길이를 알아 내려고 시도하는 대신 'RED'나 'ORANGE'등과 같은 것을 입력하는 것으로 가정합니다. 멋진 색상은 없습니다. 따라서 가장 긴 색깔은 8 자일 것입니다. 즉, 우리는 다음을 할 수 있습니다.

.bss 
    color:  resb  8 

다시 말하지만 이상적은 아니지만 작동하지만이 경우 몇 여분의 바이트로 인해 너무 많은 영향을 미치지 않아야합니다.