반응형

어셈블리어를 이용하여 문자열 입출력을 구현해보자.

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


1. 문제

  • 환경 : Visual Studio 2017, Irvine 라이브러리, x86 assembly
  • 키보드에서 문자열을 입력받아 그 문자열을 출력하고, 길이와 메모리 덤프된 결과역시 출력하라.


2. 문제 해결 방법

  1. 안내문 문자열을 출력한다.
  2. 문자열을 입력받는다. > ReadString 사용(edx에 offset 지정 및 ecx로 글자수 지정)
  3. 문자열 길이 계산 > StrLength 사용(edx에 문자열 offset 지정)
  4. 문자열 길이 0과 비교하여 0이 아닐경우 1번으로 돌아감
  5. 0이면 종료
  6. 메모리 덤프 결과 출력 > DumpMem 사용(ecx에 출력할 길이, esi에 시작주소, ebx는 단위 크기)

3. 코딩

 

TITLE Program asm3inputoutput(asm3inputoutput.asm)
; 프로그램 설명문 :	문자열 입력받고 출력하는 프로그램

INCLUDE c:\Irvine\Irvine32.inc

.data
Ask			BYTE "INPUT : ", 0
Len			BYTE "Length : ", 0
Output		BYTE "OUTPUT : ", 0
Answer		BYTE 50 DUP(?)

.code
main			PROC

START:
	mov 		edx, 0
	mov 		edx, OFFSET Ask
	call		WriteString				; ASK 안내문 출력
	mov 		edx, OFFSET Answer
	mov 		esi, edx
	mov 		ecx, SIZEOF Answer - 1
	call		ReadString				; 문자열 읽기
	call		Crlf
	mov 		edx, 0
	mov 		edx, OFFSET Len
	call		WriteString				; Len 안내문 출력
	mov 		edx, 0
	mov 		edx, OFFSET Answer
	call		StrLength				; 문자열 길이 계산
	call		WriteDec				; 문자열 길이 eax 출력
	call		Crlf
	call		Crlf
	cmp 		eax, 0					; 문자열 길이 0 비교
	jz  		LOUT					; 길이 0일 경우 프로그램 종료
	mov 		edx, 0
	mov 		edx, OFFSET Output
	call		WriteString				; OUTPUT 안내문 출력
	mov 		edx, 0
	mov 		edx, OFFSET Answer
	call		WriteString				; 입력한 문자열 출력
	call		Crlf
	mov 		ecx, eax				; 메모리 덤프 출력 길이 지정
	call		DumpMem					; 메모리 덤프 출력
	call		Crlf
	call		START					; 반복

LOUT:		exit					; 빠져나가기

main			ENDP
END			main

 

실행 결과는 다음과 같다.

 


어셈블리를 통해 다양한 문제를 풀어볼 예정이다.

반응형

'Programming > Language' 카테고리의 다른 글

[C++] 클래스(Class) 공부  (0) 2022.06.06
[Assembly] 파일 읽고 출력해보기  (0) 2020.06.06
[Assembly] 1부터 10까지의 합 계산  (0) 2020.06.04
[C++] STL - multimap 공부  (0) 2020.05.24
[C++] STL - map 공부  (0) 2020.05.14

+ Recent posts