2013-07-07 56 views
0

我真的是新的x86彙編程序設計和它的複雜性無知。 假設我已經下.bss段大會strlen輸入概率

name resb 20 

聲明一個變量,我想從用戶名輸入:

; gets name 
mov eax, 3 
mov ebx, 0 
mov ecx, name 
int 80h 

我只是想知道,如果輸入的長度通過stdin存儲在其中一個寄存器中?它是否包括回車?長度值存儲在我想?或bl?如果是這樣,我可以像這樣存儲它嗎?

mov byte[nameLen], al 

其中nameLen根據第宣佈.BSS這樣

nameLen resb 1 

我會非常想重新打印字符串輸入這樣的:

; excludes the carriage return from count 
dec byte[nameLen] 

mov eax, 4 
mov ebx, 1 
mov ecx, name 
mov edx, nameLen 
int 80h 

請幫幫我!謝謝!


使用x86 Ubuntu的Im。

回答

2

下面是兩個例子很容易理解如何在集中使用stdinstdout

  • STDIN你是對的,輸入長度被存儲在寄存器中的一個:

    ; read a byte from stdin 
    mov eax, 3   ; 3 is recognized by the system as meaning "read" 
    mov ebx, 0   ; read from standard input 
    mov ecx, name  ; address to pass to 
    mov edx, 1   ; input length (one byte) 
    int 0x80    ; call the kernel 
    

    如果我沒記錯的話,stdin不計算回車。但是你應該測試一下。

  • STDOUT你的實現是正確的,但我給你我與評論:

    ; print a byte to stdout 
    mov eax, 4   ; the system interprets 4 as "write" 
    mov ebx, 1   ; standard output (print to terminal) 
    mov ecx, name  ; pointer to the value being passed 
    mov edx, 1   ; length of output (in bytes) 
    int 0x80    ; call the kernel 
    

我會建議你最大,你在裝配在做什麼評論,因爲這是真的很難回來對你做了幾個月前一碼......

編輯: 可以檢索與EAX寄存器中讀取的字符數。

整數值和內存地址在EAX寄存器中返回。

sys_read函數返回所讀取的字符數,所以這個數字是在eax之後調用的函數。

下面是使用eax程序的一個例子:

section .data 
     nameLen: db 20 

section .bss 
     name: resb 20 

section .text 
     global _start 

_exit: 
     mov eax, 1    ; exit 
     mov ebx, 0    ; exit status 
     int 80h 

_start: 
     mov eax, 3    ; 3 is recognized by the system as meaning "read" 
     mov ebx, 0    ; read from the standard input 
     mov ecx, name    ; address to pass to 
     mov edx, nameLen   ; input length 
     int 80h 

     cmp eax, 0    ; compare the returned value of the function with 0 
     je _exit     ; jump to _exit if equal 

     mov edx, eax    ; save the number of bytes read 
            ; it will be passed to the write function 

     mov eax, 4    ; the system interprets 4 as "write" 
     mov ebx, 1    ; standard output (print to terminal) 
     mov ecx, name    ; pointer to the value being passed 
     int 80h 

     jmp _start    ; Infinite loop to continue reading on the standard input 

這個簡單的程序繼續閱讀標準輸入和打印在標準輸出的結果。

+0

但是如何在讀取之後檢索輸入字符串的長度?任何輸入字符串可以具有來自用戶的任意長度。當我將字符串重新打印到標準輸出時,我想要這個長度。 雖然非常詳細的解釋。謝謝! –

+1

我用示例更新了我的帖子以檢索閱讀的字符數。 –

+0

是的,那就解決了!這條線'mov edx,eax'使我從很多頭部抓起來。現在我知道讀取的字節存儲在eax寄存器中。謝謝! :D –