Directorios en Assembly


Para trabajar directamente con directorios (crear, eliminar, renombrar, etc.) vamos a utilizar los valores de las constantes de las llamadas al sistema (system call numbers).

Las constantes básicas para trabajar con los directorios son:

%define __NR_mkdir	39
%define __NR_rmdir	40

Creando un directorio

Para crear un directorio vamos a utilizar la llamada al sistema __NR_mkdir con el valor decimal 39.

Siguiendo el prototipo de la función mkdir en C, tomamos en cuenta dos parámetros:

int mkdir( const char *pathname, mode_t mode );

Esto quiere decir que haremos la llamada al sistema, especificamos el nombre y los permisos que deseemos:

;
; Constantes
;
%define __NR_exit	1
%define __NR_mkdir	39

section .data
Carpeta db 'Fotografias', 0

section .text
global main

main:

	; Crear un directorio
	mov	eax, __NR_mkdir
	mov	ebx, Carpeta
	mov	ecx, 0755q
	int	80h

	; Finalizamos el programa
	mov	eax, __NR_exit
	xor	ebx, ebx
	int	80h

Importante: Los valores que asignan los permisos a los archivos o directorios se encuentran en base octal, es por esa razón que se debe especificar la base con la letra q, ya que al no hacerlo, el valor 0755 se tomaría como decimal y no asignará los permisos adecuadamente.

$ nasm -f elf creadir.S
$ gcc creadir.o -o creadir
$ ./creadir

Eliminar un directorio

Siguiendo el prototipo de la función rmdir en C, vemos que solo cuenta con un parámetro:

int rmdir( const char *pathname );

Tan solo tenemos que especificar el nombre del directorio a eliminar.

;
; Constantes
;
%define __NR_exit	1
%define __NR_rmdir	40

section .data
Carpeta db 'Fotografias', 0

section .text
global main

main:

	; Eliminar el directorio
	mov	eax, __NR_rmdir
	mov	ebx, Carpeta
	int	80h

	; Finalizamos el programa
	mov	eax, __NR_exit
	xor	ebx, ebx
	int	80h
$ nasm -f elf eliminadir.S
$ gcc eliminadir.o -o eliminadir
$ ./eliminadir

Agradecimiento

Gracias a Miguel @halowin3 por la idea y ayuda.

Posted in

Leave a Reply