我目前正在編寫一個DOS程序。在這個程序中,我使用服務21/AH=01從標準輸入中讀取一個字符。但是,似乎在從文件重定向標準輸入時,EOF檢測無法按預期工作。我在NASM語法寫了這個示例程序來說明這個問題:如何從DOS中的標準輸入中讀取字符,以便重定向起作用?
org 0x100
; read characters and sum them up
main: xor bx,bx
.1: mov ah,1
int 0x21
xor ah,ah
add bx,ax
cmp al,0x1a ; eof reached?
jnz .1
mov cx,4
.2: mov si,bx
shr si,12
mov dl,[hextab+si] ; convert to hex
mov ah,2
int 0x21
shl bx,4
loop .2
ret
hextab: db 'ABCDEF'
當我從一個文件重定向標準輸入,程序掛起,除非該文件包含了^ Z地方。我的印象是EOF在服務器21/AH = 01上標記爲返回^ Z,但是,似乎並非如此。
如何從DOS中的標準輸入中讀取一個字符,以重定向的stdin的方式工作,以便在輸入未重定向時可以將字符回顯到屏幕上,並且可以檢測到EOF狀況?理想情況下,我希望有一些行爲類似getchar()
函數。
請問如果運行MS-真正的同樣的事情發生DOS? –
@MichaelPetch我還沒試過!讓我明天檢查一下。 – fuz
@MichaelPetch在真正的MS-DOS上(我測試過MS-DOS 6.02),除了^ Z甚至沒有在輸入被重定向時終止程序時,大多情況也是如此。另一個區別是,當輸入被重定向時,它被複制到終端。 – fuz