반응형

어셈블리어를 이용하여 파일을 읽고 출력하는 프로그램을 구현해보자.

필자는 Visual Studio 2017과 Irvine 라이브러리를 활용하여 개발할 예정이다.


1. 문제

  • 환경 : Visual Studio 2017, Irvine 라이브러리, x86 assembly
  • 디스크 파일을 읽어 읽은 결과를 메모리 덤프 및 화면 출력하는 프로그램을 작성
  • 디스크 파일은 c:\...\source\...\프로젝트\프로젝트\파일명에 위치

2. 문제 해결 방법

  1. 파일명과, 버퍼, 버퍼크기를 정의해준다(본 문제에선 버퍼 사이즈를 240이라 지정하였다.)
  2. 파일명 offset을 edx에 넣고, OpenInputFile을 call하여 파일 핸들값을 eax에 얻어온다.
  3. 정상적으로 파일이 열린경우 ReadFromFile을 이용하여 문자열을 읽어 버퍼에 넣는다.
  4. 정상적으로 읽었을 경우 버퍼 offset을 edx에 넣어 WriteString으로 문자열을 출력한다.
  5. 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

+ Recent posts