문자 입출력

2025. 4. 13. 18:28어셈블리 프로그래밍

INT

  • 문자를 입출력하기 위한 명령어
-운영체제가 관리하는 BOIS 루틴과 DOS루틴을 프로그램에서 사용하여 문자 입출력을 수행

-이런 루틴을 프로그램에서 호출하기 위해 사용하는 명령어
INT 인터러트번호(interrupt number)
  • INT 16H는 자판 입력을 수행
  • INT 21H는 AH에 저장된 값에 따라 기능을 수행

단일 문자 입력

MOW AH,1 ;단일 문자 입력 기능

INT 21H ;입력 받은 값은 AL에 저장

단일 문자 출력

MOV BL, AL ;입력 받은 값(AL)은 다른 레지스터에 저장
....
MOV AH, 2 ;문자열 출력 기능으로 설정

MOV DL, BL ;DL에 BL 에 저장

INT 21H ;문자 출력
  • AH가 1인 경우는 단일 문자 입력이고 2인 경우는 단일 문자 출력 기능이다.
  • DL 레지스터에 저장하고 INT 21H 명령어가 들어오면 DL에 있는 값을 출력한다.
ex)
1. 줄바꿈 출력
MOV AH,2 ;단일 문자 입출력 기능으로 설정

MOV DL,0DH ;케리지 리턴을 DL에 저장(ODH가 케리지 리턴 아스키코드 값) 

INT 21H

MOV DL, 0AH ;라인 피드를 DL에 저장(OAH가 라인 피드 아스키코드 값)

INT 21H​


2. 한 문자를 입력 받고 출력

?A
A
.MODEL SMALL         ; 메모리 모델 설정
.STACK 100H          ; 스택 크기 설정
.CODE                ; 코드 섹션 시작

MAIN PROC
    ; '?' 출력
    MOV AH, 2
    MOV DL, '?'     
    INT 21H

    ; 문자 입력
    MOV AH, 1        
    INT 21H
    MOV BL, AL       ; 입력 문자를 BL에 저장

    ; 줄 바꿈
    MOV AH, 2
    MOV DL, 0DH      ; Carriage return
    INT 21H
    MOV DL, 0AH      ; Line feed
    INT 21H

    ; 입력 문자 출력
    MOV DL, BL       
    INT 21H

    ; 프로그램 종료
    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN

문자열 출력

  • 출력할 문자열은 데이터 세그먼트에 미리 정의되어야 함
  • AH 레지스터에 9를 저장해 두고, 문자열의 옵셋 주소를 DX에 저장하고 INT 21H 명령어를 실행해 주면 된다.
  • DX에 저장된 문자열의 옵셋 주소부터 '$'가 나타날 때까지 화면에 문자를 연속적으로 출력해 준다.
  • 또한 문자열을 데이터 레지스터에 저장하기 위해서 LEA 명령어를 활용한다.
MOV AH,9 ;문자열 출력 기능으로 설정
LEA DX ;문자열 이름 ;DX레지스터에 출력한 문자열을 저장
INT 21H ;문자열을 출력
  • LEA 명령어: 문자열의 옵셋 주소를 목적지 레지스터에 저장
ex)
1. "hello world" 출력
.MODEL SMALL ; 메모리 모델 지정 - SMALL (코드와 데이터가 각각 세그먼트 하나씩)
.STACK 100H  ; 스택 크기 설정 (256 바이트)
.DATA
OUTPUT_STR DW 'Hello World$' ; '$'로 끝나는 문자열 (INT 21H, AH=09 서비스에 필요)
.CODE
MAIN PROC
    MOV AX,@DATA  ; 데이터 세그먼트 주소를 AX에 로드
    MOV DS, AX    ; DS 레지스터 설정

    MOV AH, 9   ; DOS 서비스 09h: 문자열 출력
    LEA DX, OUTPUT_STR ; DX에 문자열 주소 (오프셋) 전달
    INT 21H   ; 인터럽트 호출

    MOV AH, 4CH   ; 프로그램 종료
    INT 21H
MAIN ENDP
	END MAIN​


2. 단일 문자 받고 출력하기

input: M
ouput: M
.MODEL SMALL
.STACK 100H
.DATA
INPUT_MSG  DB 'Input: $'
OUTPUT_MSG DB 'Output: $'
LINE_SWITCH DB 0DH, 0AH, '$'   ; 올바른 줄 바꿈 시퀀스
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    ; 입력 메시지 출력
    MOV AH, 9
    LEA DX, INPUT_MSG
    INT 21H

    ; 키보드로부터 한 글자 입력
    MOV AH, 1
    INT 21H
    MOV BL, AL

    ; 줄 바꿈 출력
    MOV AH, 9
    LEA DX, LINE_SWITCH
    INT 21H

    ; 출력 메시지 출력
    MOV AH, 9
    LEA DX, OUTPUT_MSG
    INT 21H

    ; 입력했던 문자 출력
    MOV DL, BL
    MOV AH, 2
    INT 21H

    ; 프로그램 종료
    MOV AH, 4CH
    INT 21H
MAIN ENDP
	END MAIN

어셈블리 프로그램 실행

  • 기계어 코드로 변환된 실행파일을 만들기 위해서 MASM 어셈블리가 필요하다.
  • MASM 어셈블리는 소스 프로그램을 어셈블링 하여 목적 코드를 생성하고 링크를 통해 최종적으로 실행파일을 생성한다.
실행파일을 만들고 실행하는 과정

1. 편집기를 사용하여 소스 프로그램을 작성하고 ASM으로 저장 → TEST.asm

2. 소스 프로그램을 어셈블링함(MASM 활용) → TEST.obj, TEST.. crf...(목적 파일과 목적 파일 외의 파일 생성)

3. 링커를 활용하여 최종적으로 실행파일 생성 → TEST.exe, TEST.lib... (실행 파일과 실행파일 외에 파일 생성)

문자열 출력 문제

  • 단일 문자를 입력받은 후 입력받은 문자와 다음 문자를 출력하는 프로그램
예제 입출력
?2
23​


정답 코드

.MODEL SMALL 
.STACK 100H
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    ; 문자 '?' 출력
    MOV AH,2
    MOV DL, '?'
    INT 21H

    ; 문자 입력
    MOV AH,1
    INT 21H
    MOV BL, AL

    ; 줄 바꿈
    MOV AH,2
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    ; 입력한 문자 출력
    MOV DL, BL
    INT 21H

    ; 다음 문자 출력 (입력한 문자 + 1)
    INC BL
    MOV DL, BL
    INT 21H

    ; 프로그램 종료
    MOV AH, 4CH
    INT 21H

MAIN ENDP 
    END MAIN
  • 한 대문자를 입력받고 입력받은 대문자를 소문자로 변경한 뒤 소문자로 출력하는 프로그램
예제 입출력
?S
s​


정답 코드

.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC

    MOV AH, 2
    MOV DL, '?'
    INT 21H

    MOV AH, 1
    INT 21H
    MOV BL, AL

    MOV AH, 2
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    ; 소문자로 변환 (대문자 입력 시)
    ADD BL, 20H
    MOV DL, BL
    INT 21H

    ; 프로그램 종료
    MOV AH, 4CH
    INT 21H

MAIN ENDP
	END MAIN
  • 대문자 3개를 입력받고 순서의 반대로 출력하는 프로그램
예제 입출력
?ABC
CBA​


정답 코드

.MODEL SMALL
.STACK 100H
.DATA 
CH1 DB ?
CH2 DB ?
CH3 DB ?  

.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    MOV AH, 2
    MOV DL, '?'
    INT 21H

    ; 첫 문자 입력
    MOV AH, 1
    INT 21H
    MOV CH1, AL

    ; 두 번째 문자 입력
    INT 21H
    MOV CH2, AL

    ; 세 번째 문자 입력
    INT 21H
    MOV CH3, AL

    ; 줄 바꿈
    MOV AH, 2
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    ; 거꾸로 출력: CH3, CH2, CH1
    MOV AH, 2
    MOV DL, CH3
    INT 21H

    MOV DL, CH2
    INT 21H

    MOV DL, CH1
    INT 21H

    ; 종료
    MOV AH, 4CH
    INT 21H
MAIN ENDP
	END MAIN
  • 0~9 사이의 수를 입력받고 입력받은 수의 10의 보수를 구하여 출력하는 프로그램
10의 보수는 아스키코드값으로 입력된 숫자에서 30H를 빼서 2진수로 변환해야 함
이후에 NEG연산자를 활용하여서 음수로 만든 다음 10을 더해서 구해주어야 함
예제 입출력
?8
2​

정답 코드
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
    MOV AH, 2
    MOV DL, '?'
    INT 21H

    ; 입력
    MOV AH, 1
    INT 21H
    MOV BL, AL ; 문자 저장
    SUB BL, 30H ; 숫자 변환

    ; 10의 보수 계산
    MOV AL, 10
    SUB AL, BL ; AL = 10 - 입력값
    MOV BL, AL ; 결과를 다시 BL에 저장

    ; 줄바꿈
    MOV AH, 2
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    ; 결과 출력
    ADD BL, 30H ; 아스키 문자로 변환
    MOV DL, BL
    INT 21H

    ; 종료
    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN​

연습 문제

  • 한 대문자를 입력받고 연속되는 대문자 5개를 출력하는 프로그램
예제 입출력
?A
ABCDE​


정답 코드

.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
    MOV AH, 2
    MOV DL, '?'
    INT 21H

    MOV AH, 1
    INT 21H

    MOV BL, AL     

    MOV AH, 2
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    MOV DL, BL
    INT 21H

    INC BL
    MOV DL, BL
    INT 21H

    INC BL
    MOV DL, BL
    INT 21H

    INC BL
    MOV DL, BL
    INT 21H

    INC BL
    MOV DL, BL
    INT 21H

    MOV AH, 4CH
    INT 21H
MAIN ENDP
    END MAIN
  • 학번과 이름을 출력하는 프로그램
예제 출력(출력만)
학번: 20241111
이름: SSJJSS​

 

정답 코드
.MODEL SMALL
.STACK 100H
.DATA
NUM  DB '학번: 20241111', '$'
NAME DB '이름: 서준성', '$'

.CODE 
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    ; 학번 출력
    MOV AH, 9
    LEA DX, NUM
    INT 21H

    ; 줄바꿈
    MOV DL, 0DH
    MOV AH, 2
    INT 21H
    MOV DL, 0AH
    INT 21H

    ; 이름 출력
    MOV AH, 9
    LEA DX, NAME
    INT 21H

    ; 종료
    MOV AH, 4CH
    INT 21H
MAIN ENDP 
    END MAIN​
  • 두 개의 소문자를 입력받고 대문자로 변환한 다음 입력받은 순서의 반대로 출력하는 프로그램
예제 입출력
?sj
JS​


정답 코드

.MODEL SMALL
.STACK 100H
.DATA
CH1 DB ?
CH2 DB ?
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    ; ? 문자 출력
    MOV AH, 2
    MOV DL, '?'
    INT 21H

    ; 첫 번째 문자 입력
    MOV AH, 1
    INT 21H
    MOV CH1, AL

    ; 두 번째 문자 입력
    MOV AH, 1
    INT 21H
    MOV CH2, AL

    ; 줄바꿈
    MOV DL, 0DH
    MOV AH, 2
    INT 21H
    MOV DL, 0AH
    MOV AH, 2
    INT 21H

    ; 소문자로 변환
    ADD CH1, 20H   ; 첫 번째 문자 소문자로 변환
    ADD CH2, 20H   ; 두 번째 문자 소문자로 변환

    ; 변환된 문자 출력 (다른 줄에)
    MOV DL, CH1
    MOV AH, 2
    INT 21H

    MOV DL, CH2
    MOV AH, 2
    INT 21H

    ; 프로그램 종료
    MOV AH, 4CH
    INT 21H

MAIN ENDP
    END MAIN
  • 합이 10보다 작은 두 수를 입력받아 합을 구하여 출력하는 프로그램
예제 입출력
?73
10​

정답 코드
.MODEL SMALL
.STACK 100H
.DATA
NUM1 DB ?
NUM2 DB ?
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    ; '?' 출력
    MOV AH, 2
    MOV DL, '?'
    INT 21H

    ; 첫 번째 문자 입력
    MOV AH, 1
    INT 21H
    MOV NUM1, AL

    ; 두 번째 문자 입력
    MOV AH, 1
    INT 21H
    MOV NUM2, AL

    ; 문자 -> 숫자로 변환
    SUB NUM1, 30H  
    SUB NUM2, 30H  
    
    ; NUM1 + NUM2 계산
    ADD NUM1, NUM2

    ; 결과를 다시 아스키 문자로 변환
    ADD NUM1, 30H  ; 결과를 다시 아스키 문자로 변환

    ; 줄바꿈
    MOV DL, 0DH
    MOV AH, 2
    INT 21H
    MOV DL, 0AH
    MOV AH, 2
    INT 21H

    MOV DL, NUM1
    MOV AH, 2
    INT 21H

    MOV AH, 4CH
    INT 21H

MAIN ENDP
    END MAIN​

'어셈블리 프로그래밍' 카테고리의 다른 글

조건문 구조(2)  (0) 2025.05.22
조건문 구조  (0) 2025.05.22
플래그 래지스터&디버거  (0) 2025.04.27
8086 어셈블리 언어  (0) 2025.04.04
8086 프로세서  (0) 2025.03.25