2013-02-14 44 views
2

我創建與三通遙控功能的文件並保存字符與40H功能(我讀到它here如何從鍵盤上讀取字符並將其保存到DOS程序集中的文件中?

我不明白如何把在DS:DX讀取字符。

這裏是我的代碼:

org 100h 
bits 16 

section .data 
    file DB 'file.txt',0 

section .bss 
    file_handle resw 1 

; CREATE FILE 
section .text 
    mov DX, file 
    mov CX, 0000h 
    mov AH, 3Ch 
    int 21h 

; START INPUT 
INPUTSTART: 
    mov AH,01h 
    int 21h 

    ; SAVE INPUT TO FILE 
    mov SI, file_handle 
    mov BX, [SI] 
    mov CX, 0001h 
    mov AH, 40h 
    int 21h 

    jmp INPUTSTART 

    mov AH,4Ch 
    int 21h 

正如你看到的節目是爲了在循環工作,並編寫儘可能多的字符內的用戶類型。請幫助獲取40h函數的文件句柄並將數據放入DS:DX

+0

您正在使用什麼彙編? – nrz 2013-02-15 00:20:34

+0

下面的兩個答案幫助我創建了適當的ASM代碼。兩者都需要一些改進,所以我不能接受他們中的任何一個。我給了+1。謝謝。 – 2013-02-16 16:28:52

+0

請接受任意一個,這樣問題就會被標記爲接受,並幫助他人找到哪些問題被接受,哪些不接受。很多時候,你會在SO中收到許多有用的答案,然後你只需要選擇哪一個對你最有幫助。 – nrz 2013-02-16 16:48:51

回答

2

基於代碼的語法,我猜你正在使用NASM並試圖創建一個.COM程序。

.COM程序的代碼從文件的開始處開始,並且沒有將文件劃分爲邏輯部分,因此您不能先放置數據部分(例如.data或.bss),並且它即使定義這些部分也沒有什麼意義。

所以,你的代碼應該是這樣的:

org 100h 
bits 16 

; code begins here 
; then goes data 

OR

org 100h 
bits 16 

jmp start 
; here goes data 
start: 
; here goes the rest of code 

接下來,功能三通遙控在AX返回一個文件句柄。您可以使用此句柄對文件執行進一步的操作(例如讀取,寫入,關閉)。你的代碼並沒有在file_handle中隱藏這個句柄,我猜這個句柄完全是爲了這個目的而定義的,它通過用mov AH,01h覆蓋AX的值來摧毀它。你需要解決這個問題。

在程序結束時,您必須使用函數3Eh關閉文件。如果不這樣做,該文件可能最終只包含一部分已寫入的數據,該文件可能無法訪問,除非重新啓動PC,否則您可能會失去打開(或創建)更多文件的能力如果你有足夠的未關閉的文件句柄。所以,最後關閉文件。

至於保存字符的文件中,沒有什麼能阻止你定義一個字節變量,說key,存儲AL進去,然後通過的key地址的功能40H,如:

... 
mov AH,01h 
int 21h 
mov [key], AL 

; SAVE INPUT TO FILE 
mov BX, [file_handle] 
mov DX, key 
mov CX, 0001h 
mov AH, 40h 
int 21h 
... 
file_handle dw 0 
key db 0 
... 

而且,請不要忘記指定一些關鍵字,以便突破您在程序中現有的無限循環。

+0

謝謝。我使用NASM作爲COM文件。我的代碼的頭看起來像(和完美的作品):組織100H 位16 部分。數據 文件DB 'file.txt的',0 character_read分貝0 .bss段 file_handle resw 1個 – 2013-02-15 16:56:09

2

其實你不的字符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 
+0

謝謝,經過一些修改代碼的作品。我也使用了Alexey的代碼。我使用NASM。 – 2013-02-15 16:55:05

相關問題