어셈블리-파일 관리

시스템은 입력 또는 출력 데이터를 바이트 스트림으로 간주합니다. 세 가지 표준 파일 스트림이 있습니다-

  • 표준 입력 (stdin),
  • 표준 출력 (stdout) 및
  • 표준 오류 (stderr).

파일 설명자

file descriptor파일 ID로 파일에 할당 된 16 비트 정수입니다. 새 파일이 생성되거나 기존 파일이 열리면 파일 설명자가 파일에 액세스하는 데 사용됩니다.

표준 파일 스트림의 파일 설명자- stdin, stdoutstderr 각각 0, 1 및 2입니다.

파일 포인터

file pointer파일에서 후속 읽기 / 쓰기 작업의 위치를 ​​바이트 단위로 지정합니다. 각 파일은 일련의 바이트로 간주됩니다. 열려있는 각 파일은 파일 시작을 기준으로 오프셋을 바이트 단위로 지정하는 파일 포인터와 연결됩니다. 파일이 열리면 파일 포인터가 0으로 설정됩니다.

파일 처리 시스템 호출

다음 표는 파일 처리와 관련된 시스템 호출을 간략하게 설명합니다.

% eax 이름 % ebx % ecx % edx
2 sys_fork 구조체 pt_regs - -
sys_read 서명되지 않은 정수 char * size_t
4 sys_write 서명되지 않은 정수 const char * size_t
5 sys_open const char * int int
6 sys_close 서명되지 않은 정수 - -
8 sys_creat const char * int -
19 sys_lseek 서명되지 않은 정수 off_t 서명되지 않은 정수

시스템 호출을 사용하는 데 필요한 단계는 앞에서 설명한 것처럼 동일합니다.

  • EAX 레지스터에 시스템 호출 번호를 입력합니다.
  • EBX, ECX 등의 레지스터에 시스템 호출에 대한 인수를 저장합니다.
  • 관련 인터럽트 (80h)를 호출합니다.
  • 결과는 일반적으로 EAX 레지스터에 반환됩니다.

파일 생성 및 열기

파일을 만들고 열려면 다음 작업을 수행하십시오.

  • 시스템 호출 sys_creat () 번호 8을 EAX 레지스터에 넣습니다.
  • EBX 레지스터에 파일 이름을 입력합니다.
  • ECX 레지스터에 파일 권한을 입력합니다.

시스템 호출은 생성 된 파일의 파일 디스크립터를 EAX 레지스터에 반환합니다. 오류가 발생한 경우 오류 코드는 EAX 레지스터에 있습니다.

기존 파일 열기

기존 파일을 열려면 다음 작업을 수행하십시오.

  • EAX 레지스터에 시스템 호출 sys_open () 번호 5를 입력합니다.
  • EBX 레지스터에 파일 이름을 입력합니다.
  • ECX 레지스터에 파일 액세스 모드를 설정합니다.
  • EDX 레지스터에 파일 권한을 넣으십시오.

시스템 호출은 생성 된 파일의 파일 디스크립터를 EAX 레지스터에 반환합니다. 오류가 발생한 경우 오류 코드는 EAX 레지스터에 있습니다.

파일 액세스 모드 중 가장 일반적으로 사용되는 모드는 읽기 전용 (0), 쓰기 전용 (1) 및 읽기-쓰기 (2)입니다.

파일에서 읽기

파일을 읽으려면 다음 작업을 수행하십시오.

  • 시스템 호출 sys_read () 번호 3을 EAX 레지스터에 넣습니다.

  • EBX 레지스터에 파일 설명자를 넣습니다.

  • ECX 레지스터의 입력 버퍼에 포인터를 놓습니다.

  • 버퍼 크기, 즉 읽을 바이트 수를 EDX 레지스터에 넣습니다.

시스템 호출은 EAX 레지스터에서 읽은 바이트 수를 반환합니다. 오류가 발생한 경우 오류 코드는 EAX 레지스터에 있습니다.

파일에 쓰기

파일에 쓰려면 다음 작업을 수행하십시오.

  • 시스템 호출 sys_write () 번호 4를 EAX 레지스터에 넣습니다.

  • EBX 레지스터에 파일 설명자를 넣습니다.

  • ECX 레지스터의 출력 버퍼에 포인터를 놓습니다.

  • 버퍼 크기, 즉 쓸 바이트 수를 EDX 레지스터에 넣습니다.

시스템 호출은 EAX 레지스터에 기록 된 실제 바이트 수를 반환합니다. 오류의 경우 오류 코드는 EAX 레지스터에 있습니다.

파일 닫기

파일을 닫으려면 다음 작업을 수행하십시오.

  • 시스템 호출 sys_close () 번호 6을 EAX 레지스터에 넣습니다.
  • EBX 레지스터에 파일 설명자를 넣습니다.

시스템 호출은 오류가 발생한 경우 EAX 레지스터의 오류 코드를 반환합니다.

파일 업데이트

파일을 업데이트하려면 다음 작업을 수행하십시오.

  • EAX 레지스터에 시스템 호출 sys_lseek () 번호 19를 입력합니다.
  • EBX 레지스터에 파일 설명자를 넣습니다.
  • ECX 레지스터에 오프셋 값을 입력합니다.
  • 오프셋의 기준 위치를 EDX 레지스터에 넣습니다.

참조 위치는 다음과 같습니다.

  • 파일 시작-값 0
  • 현재 위치-값 1
  • 파일 끝-값 2

시스템 호출은 오류가 발생한 경우 EAX 레지스터의 오류 코드를 반환합니다.

다음 프로그램은 myfile.txt 라는 파일을 만들고 열고이 파일에 'Welcome to Tutorials Point'라는 텍스트를 씁니다. 다음으로 프로그램은 파일에서 읽고 info 라는 버퍼에 데이터를 저장합니다 . 마지막으로 info에 저장된 텍스트를 표시합니다 .

section	.text
   global _start         ;must be declared for using gcc
	
_start:                  ;tell linker entry point
   ;create the file
   mov  eax, 8
   mov  ebx, file_name
   mov  ecx, 0777        ;read, write and execute by all
   int  0x80             ;call kernel
	
   mov [fd_out], eax
    
   ; write into the file
   mov	edx,len          ;number of bytes
   mov	ecx, msg         ;message to write
   mov	ebx, [fd_out]    ;file descriptor 
   mov	eax,4            ;system call number (sys_write)
   int	0x80             ;call kernel
	
   ; close the file
   mov eax, 6
   mov ebx, [fd_out]
    
   ; write the message indicating end of file write
   mov eax, 4
   mov ebx, 1
   mov ecx, msg_done
   mov edx, len_done
   int  0x80
    
   ;open the file for reading
   mov eax, 5
   mov ebx, file_name
   mov ecx, 0             ;for read only access
   mov edx, 0777          ;read, write and execute by all
   int  0x80
	
   mov  [fd_in], eax
    
   ;read from file
   mov eax, 3
   mov ebx, [fd_in]
   mov ecx, info
   mov edx, 26
   int 0x80
    
   ; close the file
   mov eax, 6
   mov ebx, [fd_in]
   int  0x80    
	
   ; print the info 
   mov eax, 4
   mov ebx, 1
   mov ecx, info
   mov edx, 26
   int 0x80
       
   mov	eax,1             ;system call number (sys_exit)
   int	0x80              ;call kernel

section	.data
file_name db 'myfile.txt'
msg db 'Welcome to Tutorials Point'
len equ  $-msg

msg_done db 'Written to file', 0xa
len_done equ $-msg_done

section .bss
fd_out resb 1
fd_in  resb 1
info resb  26

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Written to file
Welcome to Tutorials Point