어셈블리-파일 관리
시스템은 입력 또는 출력 데이터를 바이트 스트림으로 간주합니다. 세 가지 표준 파일 스트림이 있습니다-
- 표준 입력 (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