본문 바로가기
어셈블리어 공부용/x86 어셈블리어(ASSEMBLY)

80x86 어셈블리어) Hello World 출력하는 3가지 방법.

by Redoutable 2019. 8. 14.
반응형

 

 

어셈블리어로 Hello World를 출력하는 방법은 다양한데,

세 가지 방법으로 출력해 보겠습니다.

 

1. 아스키코드로 한 글자식 출력하기 (※ 환경: DOS DEBUG)

 

MOV AH, 02 ; AH 레지스터에 한 글자를 출력하는 기능번호를 수록합니다.
MOV DL, 48 ; DL 레지스터에 'H'를 수록합니다.
INT 21
MOV DL, 65 ; 'E'
INT21
MOV DL, 6C ; 'L'
INT 21
MOV DL, 6C ; 'L'
INT 21
MOV DL, 6F ; 'O'
INT 21
MOV DL, 20 ; 'SPACE'
INT 21
MOV DL, 57 ; 'W'
INT 21
MOV DL, 6F ; 'O'
INT 21
MOV DL, 72 ; 'R'
INT 21
MOV DL, 6C ; 'L'
INT 21
MOV DL, 64 ; 'D'
INT 21
MOV DL, 21 ; '!'
INT 21
INT 20     ; 실행종료

 

 

프로그래밍 후에 도스디버거에서 'G' 를 입력하면

Hello World! 가 출력되는걸 알 수 있습니다.

 

이 방법은 DL 레지스터에 아스키코드값을 하나 넣은 뒤에

INT 21 명령으로 그 아스키코드를 출력하는 방법을 반복하여

출력하는 방식입니다.

 

 

2.메모리에 문자열을 저장하고 그 문자열을 출력하기 (※ 환경: DOS DEBUG)

 

MOV AH,09          ; AH레지스터에 기능번호 9h번을 입력해줍니다. 9h번은 한 글자가 아니라 문자열을 출력하는 기능입니다.
MOV DX, 109        ; DX레지스터에 109h(DB문 주소)를 수록합니다. 이 레지스터가 가르키는 주소의 데이터를 출력하게 됩니다.
INT 21             ; 명령 실행
INT 20             ; 프로그램 종료
DB 'Hello World!$'; DB는 해당 주소에 Hello World! 문자열 크기만큼의 데이터를 할당하고 이 곳에 문자열을 수록하는 의사명령.

 

 

작동 확인.

 

 

자세하게 말하자면

DX 레지스터에 메모리 주소를 입력시키고 (mov dx,109 => 0715:0109)

그 메모리주소에 문자열을 입력시킵니다.(0715:0109 DB 'HELLO WORLD!$')

그리고 ah 레지스터에 기능번호 9번을 수록하고 (십진수 9 가 아니라 16진수 9.)

int 21 명령으로 dx레지스터에 기록되어 있는 주소의 문자열을 출력합니다.

 

안타깝게도 도스 디버거는 간이 어셈블러이기 때문에

임의로 메모리 주소를 지정하는건 어렵습니다.

 

 

3.라벨을 이용하여 출력하기 (※환경: Emu 8086)

 

도스디버거에 라벨기능을 이용하려고하면

어셈블 오류가 뜹니다.

(메모리에 msg 라는 이름을 가진 구역을 만들라는 명령을 이해하지 못하는 도스디버거)

 

하지만 어셈블러(MASM,FASM 등등)는

편리한 라벨이라는 기능을 이용해서

Hello World! 쯤은 손쉽게 출력이 가능합니다.

 

.MODEL SMALL
.CODE
ORG 100h

PROG:
CALL MAIN              ; 'MAIN'이라는 프로시저 호출
HLT                    ;  'MAIN 프로시저가 완료되면'프로그램 중단

MSG DB 'HELLO WORLD!$' ; 메모리에 'MSG'라는 이름을 가진 데이터영역 생성후 문자열 저장

MAIN PROC              ; MAIN 프로시저 시작

LEA DX, MSG            ; DX 레지스터에 MSG 데이터영역의 주소를 가져와 넣기
MOV AH,9               ; AH 레지스터에 기능번호 9h번 수록
INT 21h                ; 실행
MAIN ENDP              ; 'MAIN'프로시저의 끝
END PROG               ; 프로그램의 끝

 

 

어셈블러를 이용하면 고급언어처럼

프로그래밍 하는것이 가능해집니다.

EMU 8086 으로 실습해보는걸 추천합니다.

 

작동확인

반응형

댓글