반응형
어셈블리어를 이용하여 문자열 입출력을 구현해보자.
필자는 Visual Studio 2017과 Irvine 라이브러리를 활용하여 개발할 예정이다.
1. 문제
- 환경 : Visual Studio 2017, Irvine 라이브러리, x86 assembly
- 키보드에서 문자열을 입력받아 그 문자열을 출력하고, 길이와 메모리 덤프된 결과역시 출력하라.
2. 문제 해결 방법
- 안내문 문자열을 출력한다.
- 문자열을 입력받는다. > ReadString 사용(edx에 offset 지정 및 ecx로 글자수 지정)
- 문자열 길이 계산 > StrLength 사용(edx에 문자열 offset 지정)
- 문자열 길이 0과 비교하여 0이 아닐경우 1번으로 돌아감
- 0이면 종료
- 메모리 덤프 결과 출력 > 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 |