2011-10-23 63 views
3

因此,我正在使用NASM爲Linux的x86彙編程序工作。這個程序基本上要求用戶輸入他們的名字和他們喜歡的顏色。這樣做的,存放在.bss段聲明的變量的兩個字符串後,程序打印「的用戶沒辦法名,喜歡的顏色是我最喜歡的顏色,太!正確的用戶輸入 - x86 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 

我在做什麼的代碼是以上。有沒有人有一個很好的方法來找到輸入的字符串的長度,或一次接收一個字符來找出長度e字符串?

預先感謝您。

回答

1

int80getname返回後,EAX將包含實際讀取的字節數或負的錯誤指示。

你應該

  1. 檢查錯誤返回
  2. 店的返回值,因爲它給你輸入的長度

在等價的C代碼:

char name[20]; 
int rc; 

rc = syscall(SYS_read, 0, name, 20-1); // leave space for terminating NUL 
if (rc < 0) { 
    // handle error 
} else { 
    name[rc] = '\0';      // NUL terminate the string 
} 
+0

我嘗試過,但由於某種原因,我總是得到我聲明的變量的返回值.bss ....我在做什麼興錯了? – nmagerko

+0

@nmagerko:你是說在int 80之後,EAX沒有輸入字符串的長度嗎? –

+0

^是的。這有意義嗎? – nmagerko