* 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
'Programing > Assembley 16bit' 카테고리의 다른 글
Assembly INT 10 속성들 정리 (0) | 2010.05.31 |
---|---|
Assembly 05. 비디오, 키보드 처리 인터럽트 (0) | 2010.05.31 |
Assembly 04. 변수 Swap 프로그램 (0) | 2010.05.10 |
Assembly 02. 어셈블리 기본 구조 및 변수 (3) | 2010.05.10 |
Assembly 01. IBM assembler MASM 설치 (1) | 2010.05.10 |