어셈블리-파일 관리
시스템은 입력 또는 출력 데이터를 바이트 스트림으로 간주합니다. 세 가지 표준 파일 스트림이 있습니다-
- 표준 입력 (stdin),
- 표준 출력 (stdout) 및
- 표준 오류 (stderr).
파일 설명자
ㅏ file descriptor파일 ID로 파일에 할당 된 16 비트 정수입니다. 새 파일이 생성되거나 기존 파일이 열리면 파일 설명자가 파일에 액세스하는 데 사용됩니다.
표준 파일 스트림의 파일 설명자- stdin, stdout 과 stderr 각각 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