2016-05-16 4 views
0

現在プロジェクトに取り掛かっています。ファイルに数値を書き込む必要があります。ここで私はこれまで試したものです:アセンブリ内のtxtファイルへの書き込み

keyHolder dw ? 
    filename db 'drawlog.txt',0 
    filehandle dw ? 
    ErrorMsg db 'Error', 13, 10,'$' 

proc OpenFile 
    mov ah, 3Dh 
    mov al, 2 
    mov dx, offset filename 
    int 21h 
    jc openerror 
    mov [filehandle], ax 
    ret 
    openerror: 
     mov dx, offset ErrorMsg 
     mov ah, 9h 
     int 21h 
     ret 
endp OpenFile 

proc closeFile 
    mov ah,3Eh 
    mov bx,[filehandle] 
    int 21h 
    ret 
endp closeFile 

proc writeKeyToFile 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 1 
    mov dx, offset keyHolder 
    int 21h 
    mov cx,1 
    mov ah, 40h 
    mov dl, 13 
    int 21h 
    mov cx,1 
    mov ah,40h 
    mov dl, 10 
    int 21h 
    ret 
endp writeKeyToFile 

コードは、作業の一種であるが、私はお願いしたい二つのものがあります。まず、書き込みが行われた後、ファイルには何が書き込まれていてはならないか、他の奇妙なシンボルが含まれます。次に、私が(ファイルに書き込むときに)私がしたいときに私は行を下に行くことができますか?書き込み後の

+0

取得した情報に基づいて質問を変更しないでください。しかし、本当に追加されていることを明確に述べている限り、質問に__add__することはできます。 – Fifoernik

答えて

1

は、ファイルを起こるあなたがmov cx, 16(16のバイトが書かれるべきであることを指定しているものを書かれている必要がありますし、他の変な記号

含める - あなたけれども、私は、これはDOSであると仮定しています言及しないでください)。指定するアドレスは、2バイトの変数だけです。次の14バイトには、おそらくファイルに書き込まれない値が含まれています。

keyHolderが実際に文字列を表す場合は、「単語」(dw)として宣言しないでください。これは一連のバイトです。 (書き込みしようとしている数字を表すには2バイトで十分ですか?)

2番目のことは、ファイルに書き込むときに行を下げる方法です)

キャリッジリターン+改行シーケンス(CRLF;バイト値13の後に10)を記述します。

+0

ありがとう、私はそれを少し演奏し、すべてが動作しています!ありがとう! – Cake

+0

「dw」は「データワード」、16ビットです。 「dd」は「データdword」、「db」は「データバイト」である。あるいは、最初の 'd'は定義を表しているかもしれませんが、私は起源についてはわかりません。とにかく 'keyHolder'に続くバイトの内容を確実に判断することができます。これはasmであり、直後に' filename'が続きます。 「変数」は、高いレベルの概念です。 asmには、メモリまたはレジスタだけがあります。 MASMのようなアセンブラの中には、メモリアドレスのラベルを使用する命令の場合、ラベルに続く 'db' /' dw'/'dd'に基づいてオペランドのサイズを推測するものもあります。 –

+0

@PeterCordesはい、「信頼できる判断ができません」という言葉は悪い選択でした(今言い直されました)。私がMASMを使用してからずっとずっと長い間、私はアセンブリに徹底的に掘り下げていますが、それは少なくとも32ビットなので、サイズについては混乱していますが、もちろん正しいです。奇妙なことに、 'filename'は' '奇妙なシンボル '"ではなくファイルに書き込まれると予想される 'keyHolder'変数に続きます。私はOPの貼り付けられたコードが完全ではないと思われ、その間に他の変数があると思う。 – davmac

0

keyHolderは、コードで初期化されていません。ファイルに新しい行に渡すためには、この変数を宣言:あなたはkeyHolderを書き後

newline db '\r\n' 

次に、ファイルに書き込みます。したがって、writeKeyToFile関数は次のようになります。

proc writeKeyToFile 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 16 
    mov dx, offset keyHolder 
    int 21h 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 2 
    mov dx, offset newline 
    int 21h 
ret 
+0

助けてくれてありがとう、私は仕事にすべてを持っています! – Cake

+2

@Cake:答えがあなたの問題を解決した場合は、それらのいずれかの投票矢印の下のチェックマークをクリックして、それを受け入れたものとしてマークする必要があります。 –

+0

'newline'は' \ n''の後に0をつけ、両方のバイトをファイル( 'mov cx、2')に書くべきです。しかしMS-DOSでは、行終了シーケンスは通常 '\ r \ n'(13、10)であり、確かにNULLバイトは含まれません。 – davmac

関連する問題