2016-12-29 16 views
-1

MASMアセンブラでテキストファイル(後でお読みください)を開こうとしています。これは、割り込みがint 21h, AH = 3Dhで行われなければなりません。私は0ALレジスタにプッシュし(ファイルを "読み取り専用"として開く)、ASCIIファイル名をDXにプッシュしました。通常、ファイルハンドルはAXにプッシュされますが、そうではありません。私は2をALに戻しています(これはファイルハンドルではなく、C = 1なのでエラーです)。これは(インターネットで検索した後に)テキストファイルが存在しないことを意味します。私が紛失しているものがありますか?ファイルは存在し、私のASMファイルと同じフォルダにあります。(MASM)アセンブラでテキストファイルを開こうとしているときにエラーが発生しました

start: 

sti        
cld        

push ds       
pop es       

code: 

; Opening a file with file = ASCII path 
mov ah, 3Dh 
mov al, 0 
lea dx, [file] 
int 21h 

; Save AX as our file handle 
mov [handle], ax 

; Put the handle in BX 
mov bx, [handle] 

; Close the file 
mov ah, 3Eh 
int 21h 

; Stop the program 
mov eax, 4c00h 
int 21h 

DATASEG 

handle dw 0 
file db 'abcd.txt', 0 
+0

「現在の」ディレクトリに「abcd.txt」はありますか?あなたは(明らかに)デバッガを介してこれをトレースしているので、割り込みを実行する前にds:dxをダンプして、それがあなたの考えであることを確認することもできます。 –

+0

_Pushed_は何かをスタックに置いたことを説明するのに使うものです。値はレジスタに_moving_しています。とにかく、.asmファイルは実行されたものではないため、テキストファイルが.asmファイルと同じディレクトリにあるかどうかは関係ありません。生成されたexe/comファイルはどこから実行されていますか? – Michael

+0

@Michael専門用語を訂正していただきありがとうございます。すべてのファイルは同じフォルダにあります:My txtファイル、生成されたexeファイル、makefile、および.asmファイル。 – pvdsp

答えて

0

ビットのために遊んでみた後、私はかなり理解していないされ、dxの代わりにedxにファイル名を移動した場合に私が見つけた他のすべてのソースファイルと言ったので、私の問題が修正されていることに気づきました名前はdxにする必要があります。問題は、なぜこれが機能するのでしょうか?

+0

'mov edx、imm32'(あなたの 'lea'命令)は実際には16ビットモードで' mov dx、imm16'として実行される汎用の 'mov D、imm'であるため、 'imm32'の上位ワードコードとして実行されます。 'file'のオフセットは64KiBより小さく、したがって、上位ワードはゼロです。つまり、' add [bx + si]、al'です。 'al'はゼロですので、操作はちょうど高価なnopで​​す。コーディーグレイがそのコメントで示唆したように、あなたのプログラムを適切に組み立てる**。 –

関連する問題