Programing/Assembley 16bit

Assembly 03. 조건, 제어문

sosal 2010. 5. 10. 17:57
반응형
/*
 
http://sosal.tistory.com/
 * made by so_Sal
 */



1. 어셈블리 기본 뼈대
2. CMP 구문, JMP 구문
3. CMP와 JMP를 사용한 반복문 예제
4. LOOP를 이용한 반복
5. LOOP를 이용한 반복문 예제




1. 어셈블리 기본 뼈대

for(i=0;i<10;i++){
       ~;
}

C언어에서 원하는 루틴을 반복하기 위한 for 구문입니다.

이것을 어셈블리에서 실습해보겠습니다.

" Assembly 02. 어셈블리 기본 구조 및 변수 " 포스팅에서 소스를 가져오겠습니다.
sosal을 출력하는 간단한 프로그램입니다.

PAGE 60,132
TITLE A04ASM2 (EXE) MOVE AND ADD OPERATION

; -------------------------------------------------------------------------
         .MODEL SMALL
         .STACK 64
         .DATA    ;DEFINE DATA

ARRAY         DB        'Sosal','$'
; -----------------------------------------------------------------------
                .CODE                              ;코드 세그먼트의 시작입니다.
MAIN        PROC       FAR
                MOV        AX,@data          ;@data는 데이타 세그먼트
                MOV        DS,AX               ;DS 레지스터에 @data 주소 삽입
                MOV        ES,AX               ;ES 레지스터에 @data 주소 삽입

                MOV        AH,09H              ;출력을 위한 21H 인터럽트 속성 설정
                LEA         DX,ARRAY         ;출력을 원하는 변수의 주소값 가져오기
                INT          21H                   ;21H 인터럽트 발생 (문자열 출력)

                MOV        AX,4C00H          ;프로그램 종료를 위한 INT 21H 인터럽트 속성 설정
                INT          21H                   ;21H 인터럽트 발생 (프로그램 종료)

MAIN        ENDP                               ;END OF PROCEDURE
; -----------------------------------------------------------------------
; 이곳에 원하는 새로운 프로시저(함수) 삽입 가능
; -----------------------------------------------------------------------
                END        MAIN                 ;END OF PROGRAM



2. CMP와 JMP
어셈블리 제어문을 이용하여 sosal을 10번 출력하는 프로그램을 공부해봅시다.


CMP 구문 : 두 개의 수치 데이터를 비교하는데 사용되는 명령어입니다.
          .CODE         ; 코드세그먼트 위치입니다.
CMP   DX,00          ; DX==0? 인지 확인
JE      L10             ; DX==0이면 L10로 이동한다.
          ....
L10:    ....              ; DX==0이면 이동할 위치


JMP 구문 : 원하는 코드세그먼트 영역으로 이동하는 명령어입니다.
          .CODE         ; 코드세그먼트 위치입니다.
          .....
L10:                       ;  <── ┐
          .....                          │
          JMP L10       ;  점프!  ┘

L10의 위치가 JMP 구문 위에 있던, 아래에 있던 관계 없습니다.
JMP를 이용하면 원하는곳으로 어디든지 이동할 수 있습니다.
하지만 위와같이 단순히 프로그래밍을 한다면 영원히 프로그램이 끝나지 않겠죠

JE? :: Jump equal 의미입니다.
DX가 0이면 CMP 명령어는 ZF (Zero Flag) 를 1로 설정합니다.
JE는 ZF (Zero Flag)의 상태를 확인하고,
1이면 점프하고, 그렇지 않다면 점프하지 않습니다.

다양한 점프 구문이 있습니다,

JE   / ZE       Jumb equal / Jump zero
JNE / JNZ     Jump not equal / jump not zero
JA   / JNBE    Jump Above / Jump not below,equal
JAE / JNB      Jump above,equal / Jump not below
JB   / JNAE    Jump below / jump not above , equal
JBE / JNA      Jump below,equal / Jump not above
JG   / JNLE    Jump Greater, euql / Jump not less
JGE / JNL      Jump Less euql / Jump not greater




3. Jmp와 Cmp를 이용한 for문 예제

PAGE 60,132
TITLE A04ASM2 (EXE) MOVE AND ADD OPERATION
; -------------------------------------------------------------------------
         .MODEL SMALL
         .STACK 64
         .DATA    ;DEFINE DATA

ARRAY         DB        'Sosal','$'
; -----------------------------------------------------------------------
                .CODE                              ;코드 세그먼트의 시작입니다.
MAIN        PROC       FAR
                MOV        AX,@data          ;@data는 데이타 세그먼트
                MOV        DS,AX               ;DS 레지스터에 @data 주소 삽입
                MOV        ES,AX               ;ES 레지스터에 @data 주소 삽입

                MOV        CX,10                ;10번 반복을 위한 Counter 레지스터 CX

L10:                                                 ;점프 도착지점
                DEC         CX                   ; Counter 레지스터 10에서부터 한칸씩 계속 감소
                MOV        AH,09H              ;출력을 위한 21H 인터럽트 속성 설정
                LEA         DX,ARRAY         ;출력을 원하는 변수의 주소값 가져오기
                INT          21H                   ;21H 인터럽트 발생 (문자열 출력)

                CMP        CX,00                ;CX가 0인지 확인
                JNE         L10                    ;CX가 0이 "아니라면" L10으로 이동

                MOV        AX,4C00H          ;프로그램 종료를 위한 INT 21H 인터럽트 속성 설정
                INT          21H                   ;21H 인터럽트 발생 (프로그램 종료)

MAIN        ENDP                               ;END OF PROCEDURE
; -----------------------------------------------------------------------
; 이곳에 원하는 새로운 프로시저(함수) 삽입 가능
; -----------------------------------------------------------------------
                END        MAIN                 ;END OF PROGRAM


실행결과




MOV        AX,4C00Hㅅㅂ

4.LOOP를 이용한 반복문

JMP를 잘못 사용하면 무한루프를 초래하고,
CMP와 Counter를 사용해야 하는 등 불편한 점이 많다.

LOOP 명령어 사용법
[레이블 : ]        LOOP      단거리 주소

MOV         CX,8
A20:
                ......
LOOP       A20

CMP,JMP를 사용한것보다 간단하다.
(DEC, CMP, JNE 3개의 명령어를 LOOP 하나로 해결)

LOOP 명령어는 CX를 counter로 알아서 감소시킨다.

5.LOOP를 이용한 sosal x10 출력 프로그램 예제

PAGE 60,132
TITLE A04ASM2 (EXE) MOVE AND ADD OPERATION
; -------------------------------------------------------------------------
         .MODEL SMALL
         .STACK 64
         .DATA    ;DEFINE DATA

ARRAY         DB        'Sosal','$'
; -----------------------------------------------------------------------
                .CODE                              ;코드 세그먼트의 시작입니다.
MAIN        PROC       FAR
                MOV        AX,@data          ;@data는 데이타 세그먼트
                MOV        DS,AX               ;DS 레지스터에 @data 주소 삽입
                MOV        ES,AX               ;ES 레지스터에 @data 주소 삽입

                MOV        CX,10                ;10번 반복을 위한 Counter 레지스터 CX

L10:                                                 ;점프 도착지점
                MOV        AH,09H              ;출력을 위한 21H 인터럽트 속성 설정
                LEA         DX,ARRAY         ;출력을 원하는 변수의 주소값 가져오기
                INT          21H                   ;21H 인터럽트 발생 (문자열 출력)

                LOOP         L10                 ;CX가 0이 "아니라면" L10으로 이동, CX 1 감소

                MOV        AX,4C00H          ;프로그램 종료를 위한 INT 21H 인터럽트 속성 설정
                INT          21H                   ;21H 인터럽트 발생 (프로그램 종료)

MAIN        ENDP                               ;END OF PROCEDURE
; -----------------------------------------------------------------------
; 이곳에 원하는 새로운 프로시저(함수) 삽입 가능
; -----------------------------------------------------------------------
                END        MAIN                 ;END OF PROGRAM