2016-04-07 71 views
0

我試圖接受用戶在x68-64 nasm代碼中的輸入。 如果我接受16個字節(例如,0000000000000001)應該爲變量保留多少內存?使用宏接受用戶輸入

SECTION .bss 
    number resb 16 ;16 or 17(16+enter key)? 

    %macro read 2 ;is it correct SECTION for defining macro? 
    mov rax,00h 
    mov rdi,00h ;unsigned int fd. what is correct value for fd? 
    mov rsi,%1 
    mov rdi,%2 
    syscall 
    %endmacro 

SECTION .text 
    read number,16 ;16 should be passed as length or 17 considering enter key? 
+0

...你爲什麼用匯編語言寫這個?只是爲了好玩? – zwol

+0

@zwol試圖瞭解裝配的基本知識 – daemon7osh

回答

2

您的意思是16個字節,而不是位。


您正在製作一個宏來致電read(2)。有關它的功能的詳細信息,請參閱手冊頁。它只是從文件描述符中讀取字節。如果文件描述符是標準模式(非原始模式)下的tty,並且具有正常的終端設置,則它將被行緩衝。即系統調用將阻塞,直到換行符或EOF(ctrl-d)。或者直到某些事情中斷它,使其返回-EINTR,因爲您直接調用它,而不是使用glibc包裝函數,它會爲您重試中斷的系統調用。

請參閱stty(1)termios(3),以瞭解相應的tty ioctls頂部的常用標準庫包裝。 TL:DR:獲得煮熟輸入以外的東西真的很複雜。所以你沒有看到「輸入密鑰」,你只能看到換行符。

重要的是要注意,如果輸入的數據多於將傳遞給read(2)的緩衝區,那麼它只會讀取足夠的字節來填充緩衝區,其餘的仍處於待處理狀態。它們不會被丟棄,所以另一個read調用將會得到它們,而不是下一行的開始。


標準輸入總是在POSIX文件描述符爲零,所以rdi=0是正確的。

雖然,第三個參數(尺寸)在rdx。你把它rdi,這可能將與-EBADFread(2)調用返回,因爲你的進程就不可能有任何對FD 16

開放strace下運行程序,看看會發生什麼。 (strace ./a.out


讓您的緩衝區一樣大,你希望你的程序一氣呵成接受最長的線。在交互式tty上,read(2)將在一個換行符後返回,除非系統負載過重,否則在進入第二個換行符之前您的進程不會被喚醒。 (例如作爲大貼的一部分)。

+0

,這解釋了很多。那麼輸入按鍵呢?何時考慮?保留或調用宏? – daemon7osh

+1

@Deadpool:當用戶按下輸入時,tty上會出現'\ n''。你需要你的「讀」電話把它們吃掉。緩衝區必須足夠大,*和* size(讀取(2)'arg)必須足夠大。 –