2016-11-24 4 views
2

Я пытаюсь удалить файл в ассемблере (NASM), но у меня возникла ошибка «усечение переселения в соответствии с данными» в разделе «mov dx, file_name». FYI, файл, который я пытался удалить файл «input.txt», существует в моей папке. Я не настолько уверен в этом вопросе. Дайте мне знать, где я пропустил.Удалить файл в сборке

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

Вы не можете использовать 16-разрядные функции MS-DOS в исполняемом файле Linux. Чтобы удалить файл, вам необходимо использовать системный вызов Linux, так же, как вы используете системный вызов Linux для выхода из программы. –

+0

Это сообщение об ошибке относится конкретно к вашим усилиям по загрузке смещения метки в регистр 16b, тогда как вы находитесь в режиме 32b, где смещения памяти составляют 32b. Будете ли вы делать «mov edx, file_name», он будет компилироваться без предупреждения (но это не сработало, потому что 'int 21h' под linux не работает). – Ped7g

ответ

5

В Linux, чтобы удалить файл (в UNIX жаргоне, чтобы «разъединить» файл), вам нужно использовать системный вызов unlink. Его единственным аргументом является указатель на имя файла, чтобы отменить связь, он возвращает 0 при успехе, отрицательное значение при ошибке. Номер системного вызова для unlink на i386 является 10, так, чтобы вызвать unlink, написать код так:

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

Имя файла должно быть завершенную нулем строку C. Вы можете сделать строку C путем добавления ,0 в строку:

file_name DB "input.txt",0 

Обратите внимание, что этот системный вызов не может быть использован для разъединить каталоги. Чтобы удалить каталоги (здесь «удаленный» используется, поскольку удаление каталогов осуществляется в традиционных файловых системах, а не просто их перетаскивание), вам необходимо использовать системный вызов rmdir, который имеет номер 40 и те же аргументы и возвращаемое значение.