其實你不把的字符ds:dx
,而是你用ds:dx
指在字符或任何數據存儲,在英特爾的存儲地址語法這將是[ds:dx]
(但dx
無法使用用於存儲器尋址)。
所以,你需要做什麼:存儲從鍵盤DOS讀取值中斷21h
/ah = 01h
,返回在al
一些內存地址,然後請參閱內存地址與ds:dx
。
在您的代碼中,您根本不存儲文件句柄,並在寫入文件調用之前從變量file_handle
加載0,因爲這是您初始化的方式。然後你嘗試從ds:0
(因爲si
等於0)讀取文件句柄,那根本沒有意義。您只需要對文件句柄進行存儲(文件創建/ trunction後的返回值ax
),並始終將其加載到後續int 21h
中的相關寄存器中,並引用該文件(寫入文件,讀取文件,關閉文件等)。
所以,下面的修復它應該工作(沒有測試)。我還按照Ralph Brown中斷列表使用的順序組織了函數調用參數,以便更容易理解。
.section data
file db 'file.txt',0
character_read db 0
...
% create file:
mov ah,3Ch % create or truncate a file
mov dx,file % ds:dx points to ASCIIZ filename
xor cx,cx % file attributes.
int 21h
mov [file_handle], ax % file handle must be stored in memory or in a register!
INPUTSTART:
mov ah,1 % read character from STDIN, with echo.
int 21h
mov [character_read], al % store the ASCII code to memory.
% unless you want to loop eternally, you can check the ASCII code and exit.
cmp al,20h % space.
je EXIT
mov ah,40h % write to file or device
mov bx,[file_handle] % file handle is just a number.
mov cx,1 % number of bytes to write.
mov dx,character_read
int 21h
jmp INPUTSTART
EXIT:
% here you can add some clean-up code, if needed.
mov ah,3Eh % close file.
mov bx,[file_handle] % here you need the file handle again.
int 21h
mov ah,4Ch
int 21h
來源
2013-02-15 00:08:29
nrz
您正在使用什麼彙編? – nrz 2013-02-15 00:20:34
下面的兩個答案幫助我創建了適當的ASM代碼。兩者都需要一些改進,所以我不能接受他們中的任何一個。我給了+1。謝謝。 – 2013-02-16 16:28:52
請接受任意一個,這樣問題就會被標記爲接受,並幫助他人找到哪些問題被接受,哪些不接受。很多時候,你會在SO中收到許多有用的答案,然後你只需要選擇哪一個對你最有幫助。 – nrz 2013-02-16 16:48:51