본문 바로가기

Programming Language/Assembly

C-Style의 문자열 출력

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C-Style의 문자열은 끝이 \0(NULL문자)로 끝나는 문자열을 말한다. 어셈블리어에서는 긴 문자열을 별도의 변수에 보관하였다가

int 21h-02h의 반복구문을 사용하거나 문자열을 자체적으로 출력해주는 int 21h-09h를 사용할 수 있다.

.model small
.stack 64
.data
    message DB "Hello, World!", 0 ; 데이터 영역에 문자열을 정의한다.

.code
main proc far
    mov ax, @data ; ax를 거쳐서 데이터영역이 시작되는 메모리 주소를 DS와 ES 레지스터에 넣는다.
    mov ds, ax
    mov es, ax

    mov cx, 0

    main_loop:
    mov ax, offset message ; message라는 이름의 문자열 데이터가 @data에서 몇 바이트 떨어진 거리에 있는지를 가져온다.
    mov si, ax ; 메모리 참조를 위한 si 레지스터에 message의 시작 위치 넣고 (c언어의 message)
    add si, cx ; 그 위치에서 몇 번째 문자인지를 덧셈으로 추가함. (c언어의 message[cx]에 해당)
    add cx, 1 ; cx의 값을 1 증가 cx++
    ; 위 세줄을 요약하면 message[cx++];에 해당

    ; 메모리에서 가져온 문자를 출력
    mov ah, 02h
    mov dl, [si]
    int 21h

    cmp dl, 0 ; NULL 문자인지 비교
    jne main_loop ; NULL 문자 아니면 반복

    ; 종료
    mov ah, 4ch
    int 21h
main endp
end main
아래는 cx를 0에서부터 늘려나가는 대신, si값을 직접 하나씩 늘려나가는 코드이다. 연산 과정이 약간 줄어든다.
.model small
.stack 64
.data
    message DB "Hello, World!", 0 ; 데이터 영역에 문자열을 정의한다.

.code
main proc far
    mov ax, @data ; ax를 거쳐서 데이터영역이 시작되는 메모리 주소를 DS와 ES 레지스터에 넣는다.
    mov ds, ax
    mov es, ax

    mov si, offset message ; message라는 이름의 문자열 데이터가 @data에서 몇 바이트 떨어진 거리에 있는지를 가져온다.
    dec si ; si의 값을 1 감소시켜 배열의 -1번째를 참조하도록 해 두었다가 main_loop를 반복할 때 배열의 0번째 부터 시작할 수 있도록 한다.

    main_loop:
    inc si ; si가 참조하는 배열의 원소를 1 증가시킨다.
    ; 메모리에서 가져온 문자를 출력
    mov ah, 02h
    mov dl, [si]
    int 21h

    cmp dl, 0 ; NULL 문자인지 비교
    jne main_loop ; NULL 문자 아니면 반복

    ; 종료
    mov ah, 4ch
    int 21h
main endp
end main
아래 코드는 문자열을 알아서 출력해주는 int 21h-09h를 사용하는 방법이다.
.model small
.stack 64
.data
    message DB "Hello, World!", 0 ; 데이터 영역에 문자열을 정의한다.

.code
main proc far
    mov ax, @data ; ax를 거쳐서 데이터영역이 시작되는 메모리 주소를 DS와 ES 레지스터에 넣는다.
    mov ds, ax
    mov es, ax

    main_loop:
    mov ah, 09h
    mov dx, offset message ; 문자열의 위치를 주면 알아서 문자열 출력
    int 21h

    ; 종료
    mov ah, 4ch
    int 21h
main endp
end main
NASM 식 문법
org 100h

section .data
	message db "Hello, World!", "$"

segment .text
	global main

main:
	mov ah, 09h
	mov dx, message
	int 21h

	mov ax, 4ch
	int 21h

	ret

실행결과