반응형
어셈블리어를 이용하여 파일을 읽고 출력하는 프로그램을 구현해보자.
필자는 Visual Studio 2017과 Irvine 라이브러리를 활용하여 개발할 예정이다.
1. 문제
- 환경 : Visual Studio 2017, Irvine 라이브러리, x86 assembly
- 디스크 파일을 읽어 읽은 결과를 메모리 덤프 및 화면 출력하는 프로그램을 작성
- 디스크 파일은 c:\...\source\...\프로젝트\프로젝트\파일명에 위치
2. 문제 해결 방법
- 파일명과, 버퍼, 버퍼크기를 정의해준다(본 문제에선 버퍼 사이즈를 240이라 지정하였다.)
- 파일명 offset을 edx에 넣고, OpenInputFile을 call하여 파일 핸들값을 eax에 얻어온다.
- 정상적으로 파일이 열린경우 ReadFromFile을 이용하여 문자열을 읽어 버퍼에 넣는다.
- 정상적으로 읽었을 경우 버퍼 offset을 edx에 넣어 WriteString으로 문자열을 출력한다.
- ebx에 mov해둔 파일 핸들을 eax로 옮겨 CloseFile로 파일을 닫는다.
3. 코딩
TITLE Program asm4fileread(asm4fileread.asm)
; 프로그램 설명문 : 디스크의 파일을 읽고 출력하는 프로그램
INCLUDE c:\Irvine\Irvine32.inc
BUF_SIZE = 240
.data
filename BYTE "sample.txt", 0
BUF BYTE BUF_SIZE DUP(? )
good BYTE "Good processed !", 0dh, 0ah, 0
Nogood BYTE "File open or write error !", 0dh, 0ah, 0
.code
main PROC
mov edx, offset filename
call OpenInputFile ; 입력파일 열기
mov ebx, eax ; 핸들 ebx로 mov
cmp eax, 0 ; 정상 오픈 확인
jnz good_open ; eax != 0 정상open
call WriteWindowsMsg ; open 오류
jmp terminate
good_open :
mov eax, ebx
mov edx, offset BUF
mov ecx, BUF_SIZE
call ReadFromFile ; 파일 내용 읽기
jnc good_read ; cf=0이면 jmp
call WriteWindowsMsg ; open 오류
jmp terminate
good_read :
mov edx, offset BUF ; 버퍼내용 edx로 mov
call WriteString ; edx 출력
call Crlf
jmp good_end
good_end : ; 핸들 닫기
mov eax, ebx
call CloseFile
mov edx, offset good
call WriteString
exit
terminate :
mov edx, offset nogood
call WriteString
call WaitMsg
exit
main ENDP
END main
파일 내용과 실행 결과 사진은 다음과 같다.
계속해서 어셈블리를 통해 다양한 문제를 풀어볼 예정이다.
반응형
'Programming > Language' 카테고리의 다른 글
[C++] 클래스(Class) 공부 (0) | 2022.06.06 |
---|---|
[Assembly] 문자열 입력과 출력 (0) | 2020.06.05 |
[Assembly] 1부터 10까지의 합 계산 (0) | 2020.06.04 |
[C++] STL - multimap 공부 (0) | 2020.05.24 |
[C++] STL - map 공부 (0) | 2020.05.14 |