彙編語言ReadConsole函數:讀取文本輸入並將其送入緩衝區

函數 ReadConsole 爲讀取文本輸入並將其送入緩衝區提供了便捷的方法。其原型如下所示:

ReadConsole PROTO,    hConsoleInput: HANDLE z                       ;輸入句柄    lpBuffer:PTR BYTE,                                   ;緩衝區指針    nNumberOfCharsToRead:DWORD,         ;讀取的字符數    lpNumberOfCharsRead:PTR DWORD,     ;指向讀取字節數的指針    lpReserved:DWORD                                 ;未使用

hConsoleInput 是函數 GetStdHandle 返回的可用控制檯輸入句柄。參數 lpBuffer 是字符數組的偏移量。nNumberOfCharsToRead 是一個 32 位整數,指明讀取的最大字符數。lpNumberOfCharsRead 是一個允許函數填充的雙字指針,當函數返回時,字符數的計數值將被放入緩衝區。最後一個參數未使用,因此傳遞的值爲 0。

在調用 ReadConsole 時,輸入緩衝區還要包含兩個額外的字節用來保存行結束字符。如果希望輸入緩衝區裏是空字節結束字符串,則用空字節來代替內容爲 ODh 的字節。Irvine32.lib 的過程 ReadString 就是這樣操作的。


注意:Win32 API 函數不會保存 EAX、EBX、ECX 和 EDX 寄存器。

【示例】要讀取用戶輸入的字符,就調用 GetStdHandle 來獲得控制檯標準輸入句柄,再使用該句柄調用 ReadConsoleo 下面的 ReadConsole 程序演示了這個方法。

提示:Win32 API 調用與 Irvine32 鏈接庫兼容,因此在調用 Win32 函數的同時還可以調用 DumpRegs

; 從控制檯讀取    (ReadConsole.asm)INCLUDE Irvine32.incBufSize = 80.databuffer BYTE BufSize DUP(?),0,0stdInHandle HANDLE ?bytesRead   DWORD ?.codemain PROC    ; 獲取標準輸入句柄    INVOKE GetStdHandle, STD_INPUT_HANDLE    mov    stdInHandle,eax    ; 等待用戶輸入    INVOKE ReadConsole, stdInHandle, ADDR buffer,      BufSize, ADDR bytesRead, 0    ; 顯示緩衝區    mov    esi,OFFSET buffer    mov    ecx,bytesRead    mov    ebx,TYPE buffer    call    DumpMem    exitmain ENDPEND main

如果用戶輸入 “abcdefg”,程序將生成如下輸出。緩衝區會插入 9 個字節:“abcdefg” 再加上 ODh 和 OAh,即用戶按下 Enter 鍵時產生的行結束字符。bytesRead 等於 9:


圖片



圖片


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章