2016-11-24 8 views
2

アセンブリコード(NASM)でファイルを削除しようとしましたが、 "mov dx、file_name"セクションの "再配置がデータに適合するように切り捨てられました"というエラーが発生しました。参考までに、 "input.txt"ファイルを削除しようとしていたファイルが自分のフォルダに存在しています。この種の問題で私は確信が持てません。私が逃したところを教えてください。アセンブリ内のファイルを削除

Linuxの
section.data 
; filename 
file_name   DB "input.txt" 

section .text 
    global _start 

_start: 
    nop 
    mov dx, file_name ; getting an error : relocation truncated to fit R_386_16 against .data 
    mov ah,41h   ; function 41h - delete file 
    int 21h    ; call DOS service 

endIt: 
    nop 
    ;Exit the program back to linux legally 
    mov eax, 1     ; exit system call value 
    mov ebx, 0     ; exit return code 
    int 80h      ; Call the kernel 
+7

Linux実行可能ファイルで16ビットMS-DOS関数を使用することはできません。 Linuxシステムコールを使用してプログラムを終了するのと同じ方法で、Linuxシステムコールを使用してファイルを削除する必要があります。 –

+0

このエラーメッセージは、メモリオフセットが32bの32bモードになっているときに、ラベルオフセットを16bレジスタにロードするための作業を特に指しています。 'mov edx、file_name'を実行しますか?警告なしでコンパイルします(ただし、Linuxでは' int 21h'が動作しないため動作しません)。 – Ped7g

答えて

5

、(ファイルを「解除」するために、UNIX用語で)ファイルを削除するには、システムコールunlinkを使用する必要があります。その唯一の引数は、リンクを解除するファイル名へのポインタです。成功すると0を返し、エラーの場合は負の値を返します。

mov eax, 10  ; system call 10: unlink 
mov ebx, file_name ; file name to unlink 
int 80h   ; call into the system 

ファイル名がNULがC文字列を終了する必要があります:i386の上unlinkのためのシステムコール番号はので、このようなコードを記述し、unlinkを呼び出すために、10です。あなたの文字列に,0を付加することにより、Cの文字列を行うことができます。

file_name DB "input.txt",0 

(注)このシステムコールは、ディレクトリのリンクを解除するために使用することはできません。ディレクトリを削除するには(ここでは "削除"とはディレクトリを削除することは、単にそれらをリンク解除するよりも複雑な従来のファイルシステム上で使用されます)、rmdirシステムコールを使用する必要があります。このシステムコールの番号は40で、引数と戻り値は同じです。

関連する問題