크리에이티브 커먼즈 라이센스

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

백지 건강강좌/자가임상체험

물박사(자가면역질환...)^미러

전동명(천연물질사전)^미러

竹田 장승옥(블로그)^글목록

계산환산(계산기)^ 단위변환

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

다운로드>폰에 복사
>파일선택...설치됩니다.

[도움말 보기] 바로가기

개선 요구, 충고는
아래 관리자 연락
전화/메일 부탁 드립니다.
최대한 빨리 처리하고
업데이트 올리겠습니다.


asm_51.

(명령어)

어셈블리어 강좌가 4부분으로 나뉩니다.

asm_00.으로 시작한 디버그만을 사용한 프로그래밍

asm_71.로 시작한 하이텔 두루물 강좌 요약 정리

asm_51.로 시작하는 어셈블리어 명령어 해설

asm_31.로 시작하는 하드웨어 관련 정리

각 독자의 공부 취향과 방향이  다를 수 있기 때문에,

필자가 3가지 방

향으로 진행하는 강좌에서 마음에 드는 것부터 공부하시기

바랍니다.

공부 순서는 마음에 내키는 것이 가장 좋다고, 필자는

믿습니다.






제 51 장  명령어


    ┌────────────────────────────────┐

    │ asm_51.부터는 인텔 8088/8086 명령어를  정리하고자 합니다. 이

    장│

    │ 에서는 전반적인 기초를 다루고 다음  장부터는 ABC 순서로 명령

    하│

    │ 나씩을 설명합니다. 색인은 이 장에 포함되어 있습니다. │

    └────────────────────────────────┘


이 장으로부터는 8088의 명령어를 공부하기로 한다.

마이크로프로세서(MPU)는 메모리를 대상으로 작업을 진행한다.

그런데, 이미 설명했지만, 컴퓨터의 메모리는 임의의 순서로 접근할 수 있는 비트열의

배열에  불과하다. 명령이나 데이터나 모두  2진수인 기계어로 메모리에

저장되어 프로그램이 실행될 뿐만 아니라, 메모리에는 명령어와 그 명령어에 따라

처리할 대상이 되는 데이터가 비트열이라는 동일한 모양으로 뒤섞여 있다.

그렇기 때문에, 같은 메모리에  뒤섞여 저장되어 있는 비트열 중에서 어떤

것이 수치 자료이고 다른 어떤 것이 명령어 코드인지를 구분하는 일이 프로세서의

중요한 작업으로 등장하게 된다.

컴퓨터 프로세서는  명령어와 데이터(여기에서 데이터라는 말은 처리할 대상이

되는 자료)라는 그 두 가지를 구분할 수 있을까?

그 문제를 이해하려면, 프로세서가 하는 일을 먼저 이해할 필요가 있다.


    실행할 명령어를 메모리에서 읽어 온다.

    그 명령에 대한 작업을 한다.


다시 말해서 읽고 작업하고, 또 읽고 작업하는 것이 프로세서의 일이다.

알고 보면 프로세서가 읽어야  될 명령어도 메모리에 있고, 명령어에 따라

작업한 결과도 결국 메모리에 기록하게 되는 것이다.






프로세서가 메모리로부터 명령어를 읽는 작업을 fetch cycle(초치 행정)이라 하고,

그 명령어를 처리하는 작업을 execution cycle(실행 행정)이라고 부른다.

가령 메모리에 F3(h) 즉 11110011(b)이  저장되어 있을 때 그 수치는 명령

코드 repz를 표시할 수도 있고, 단순한 수치 자료 243(d)를 표시할 수도 있기 때문에

사람이 대충 보아서는 명령인지 자료인지 알기 어렵다.

그러나 컴퓨터의  마이크로프로세서(MPU)는 현재  자기가 하는 일이

 초치 행정(fetch cycle)인지 아니면 실행 행정(execution cycle)인지에 따라

같은 수치라도 초치 행정의 대상일 때는  메모리의 한 바이트를 명령 코드로

취급하며 실행 행정 중에는 그것을 단순한 수치 자료로 취급하여 구분하는 것이다.



         ## 필자통신




    초치 행정이 무엇이고 실행 행정이 무엇인지를 이해하기 위해서는 작업의

    연속성에 관한 이해가  필요할 것이다. 명령 코드 다음에는 작업 대상이

    되는 수치 자료가 와야 되고, 필요한 수치 자료가 끝나 명령이 완수되었다면

    그 후에는 다른 어떤 명령이 있어야 작업이 연속될 것이다. 이것은 비유컨대,

    배가 고프면 무언가를 먹어야 되고 먹어서 배고픈 상태가 해소되었다면 그 다음에는

    다른 무언가를 할 수 있는 인생과 비슷하다고 볼 것이다. 필자의  이 설명이

    독자의 이해에 다소 도움이 되기를 바라며, 약간 어렵더라도 매달리지 말고 넘어가기

    바란다.


초치 행정은 단순히 PC가 지적하고 있는 기억장소에서 명령어의 첫 바이트를 읽어

들일 뿐이며, 그 후에 PC는 다음의 기억장소를 지적하기 위하여 다음 바이트의 주소로

갱신된다. 만약 명령어가 한 바이트로 끝나지 않고 두 바이트 이상의 크기를 가지는

것이라면 명령어의 끝까지 초치 행정으로 읽게 될 것이다.

실행 행정 과정에 처리되는 동작은 읽혀진 명령어에 따라 달라질 것이다.






제 1 절  명령어의 크기, 형식

명령어도 프로세서에 따라 달라진다.

인텔 칩에서도 8088, 8086, 80286, 80386의 명령어가 서로 다르다. 물론 프로세서가

발전함에 따라 명령어가  확장되어 왔기 때문에 새로운 프로세서의 명령어에는

이전의 프로세서에서 사용되던 대부분의 명령어가 통할 것이다.

이 절에서는 인텔 8088의 명령어를 다루기로 한다.


     ## 활용 팁

    8088과 8086은 완전히 동일한  명령어 셋트를 가지고 있으며, 8비트

    프로세서 8080, 8085의 대표적인 명령들을 거의 포함하고 있다.



1. 명령어의 크기

인텔 8088의 명령어는 1바이트 내지 6바이트 크기로 되어 있다.

즉 8088의 모든 명령어는 영어 1글자 내지 6글자 범위에 속하는 것이다.


     ## 주의

    명령어의 크기는 우리가  어셈블리어로 입력하는 명령어의 글자 수와는

    무관하며, 그 명령어가  기계어로 번역되었을 때 몇 바이트를 차지하는가에

    달려 있다. 가령  제2절 2.2.(명령어와 자료의 구분)에서 예로 들었던 repz라는

    어셈블리 명령어의 기계어 코드는 F3(h)로 그 명령은 어셈블리어로는 4글자이지만

    1바이트 명령인 것이 좋은 예이다.







2. 명령어의 형식

인텔 8088/8086의 명령은 1 내지 6바이트 내에서 길이가 변할 수 있는 방식으로

되어 있는데, 명령어의 기본 형식은 다음과 같다.

제1바이트 = OP

코드(6) + D(1) + W(1)

제2바이트 = MOD(2)

+ REG(3) + R/M(3)

제3바이트 = low

displacement(low data)

제4바이트 = high

displacement(high data)

제5바이트 = low

data

제6바이트 = high

data

명령의 제1 내지 2바이트는 명령의  기능 및 동작을 나타내는 가장 중요한

부분이며, 나머지 바이트들은 displacement 또는 immedidate data로 구성된다.

8088의 대부분의 명령은 바이트  및 워드 데이터를 처리할 수 있으며, 오퍼랜드로서

레지스터(register), 메모리(menory), 즉치(immediate) 데이터를 자유롭게 사용할

수 있다. 특히  연산이나 비교, 시프트 명령 등에서 메모리 변수(memory variable)를

레지스터로 옮기지 않고  직접 사용할 수 있기 때문에 사용할 레지스터의 수

및 명령 수행시간을 절약할 수 있다.






3. 명령어 제1바이트의 인코딩

마이크로프로세서(MPU)의 명령은 어셈블리어  레벨과 기계어 레벨이 있는데,

일반적으로는 어셈블리어로 프로그래밍을 하지만 단일 보드 컴퓨터 등에서는 기계어를

직접 입력하는  경우도 있으므로 기계어 코드의  구조를 알아 두면 편리한

경우가 있다.

여기에서는 가장 중요한 명령어의 제1바이트 인코딩을 먼저 알아 보기로 한다.

기본형을 옮겨 두고 보면서 설명을 계속하기로 하자.

제1바이트 = OP

코드(6) + D(1) + W(1)

이미 알겠지만, 각 바이트의 비트 위치를 다시 한 번 확인하고 넘어가자.

(8비트) 제7

6 5 4 3 2 1  0(비트 위치)

제1바이트 = OP

코드(6) + D(1) + W(1)


     ## 활용 팁

    비트 위치는 자리수와 같이 생각하면 되며, 오른쪽 끝 자리부터 바이트 데이터의

    경우 0, 1, 2,  3, 4, 5, 6, 7비트로 표시하며 워드 데이터의 경우에는

    오른쪽으로부터 0, 1, 2, ... , 14, 15비트로 부른다.


기본형에서 처음의 6비트는 기본적인  명령(add, xor 등)을 나타내는 OP

코드이며, D  부분은 2개의 오퍼랜드를 요구하는  명령에서 제2바이트에서

REG(레지스터)로 지정된 오퍼랜드가 소스 오퍼랜드인지 목적 오퍼랜드인지 표시하고,

W 부분은 오퍼랜드 데이터가 워드인지 바이트인지를 알려 준다.

D=1 : REG로 지정된 데이터가 목적(destination) 오퍼랜드임

D=0 : REG로 지정된 데이터가 소스(source) 오퍼랜드임

W=1 : 오퍼랜드 데이터가 워드 크기임

W=0 : 오퍼랜드 데이터가 바이트 크기임

일부 명령에서는 D, W 외에도 S, V, Z와 같은 단일 비트 영역이 포함된다.






S는 W와 함께 사용되어 즉치(immediate) 데이터의 부호확장을 나타낸다. V는 시프트

및 로테이트 명령에서 비트 이동의 수가 1인이 가변적인지를 표시해 준다.

Z는 조건부 repeat 및 loop 명령에서 제로 플래그와의 비교 비트로 사용된다.


     ## 활용 팁

    오퍼랜드로서 워드 데이터를  다루는지 여부를 표시하는 W 비트는 명령어

    제1바이트의  0비트(끝 자리) 위치에 쓰이고  있음을 기억하면 쉬울

    것이다. 예외적인 경우는  조금 있다가 다루게 된다.  그리고, D,

    S, V 등은 W의 바로 앞인 1비트 위치에 쓰인다.


이상 설명한 S, V, Z 비트의 용법을 알아 보기로 하자.

S=1 : W=1인 경우에 8비트 데이터를 16비트로 부호를

확장함

S=0 : 부호를 확장하지 않음

V=1 : 시프트/로테이트 명령의 비트이동 수를 CL로 지정(가변적)

V=0 : 시프트/로테이트 명령의 비트이동 수는 1로 고정됨

Z=1 : 제로 플래그가 1인 동안 repeat 또는 loop

Z=0 : 제로 플래그가 0인 동안 repeat 또는 loop

이상의 설명을 참고하여 실제 기계어 코드에 적용된 명령 형식을 살펴 보자.

제1형식 제1바이트 = OP 코드(6)

+ D(1) + W(1)

제2형식 제1바이트 = OP 코드(6)

+ S(1) + W(1)

제3형식 제1바이트 = OP 코드(6)

+ V(1) + W(1)

제4형식 제1바이트 = OP 코드(7)

+ Z(1)

제5형식 제1바이트 = OP 코드(4)

+ W(1) + REG(3)

제6형식 제1바이트 = OP 코드(5)

+ REG(3)

제7형식 제1바이트 = OP 코드(3)

+ SEG(2) + (3)

이제 각 형식의 제1바이트 내용을 구체적으로 설명하기로 한다.






1) 제1형식

명령어 제1바이트의 가장 일반적인 구성은 다음과 같다.

제1바이트 = OP 코드(6) + D(1) + W(1)

이 형식은 데이터 전송명령이나  연산명령 등 2개의 오퍼랜드를 필요로 하는

대부분의 명령에서 사용된다.

제0비트(W)가 0이면 오퍼랜드 데이터의 크기는 바이트, 1이면 워드가 된다.

제1비트(D)가 0이면 레지스터 오퍼랜드가 소스, 1이면 목적이 된다.


2) 제2형식

다음으로 산술연산 명령에서 사용하는 명령 구성을 보자.

제1바이트 = OP 코드(6) + S(1) + W(1)

제1비트(S)가 0이면 부호를 확장하지 않는다.

제1비트(S)와 제0비트(W)가 모두  1이면, 즉 명령어 제1바이트가 ......11로

끝나면, 8비트 데이터를 16비트로 부호를 확장한다.


3) 제3형식

다음 형식은 shift 및 rotate 명령에서 사용되는 구성이다.

제1바이트 = OP 코드(6) + V(1) + W(1)

제1비트(V)가 0이면 1비트만큼만 이동한다.

제1비트(V)가 1이면 CL 레지스터 값만큼 비트 이동한다. CL 레지스터가 어떤 수인지

미리 알 수 없기 때문에 가변적인 비트 이동이라고 말하는 것이다.






4) 제4형식

이번에는 W 비트가 없는 특수한  형식이다. 명령의 반복 또는 루프가 제로

플래그의 값에 따라 조건부로 계속되는 명령 형식이 된다.

제1바이트 = OP 코드(7) + Z(1)

이 형식에 해당되는 명령어로는 repeat, loop 등이 있다.


5) 제5형식

이번에는 명령어의 제1바이트에 레지스터 오퍼랜드가 포함되는 형식이다.

따라서 기본형에서 0비트 자리에 있던 W 비트가 3비트 자리로 옮겨 갔다.

제1바이트 = OP 코드(4) + W(1) + REG(3)

이 형식은 mov(e) 명령에서 사용되는 명령 구성이다.

참고로, 레지스터 영역 3비트의 인코딩을 소개하면 다음과 같다.

REG(3)  000 001

010 011 100 101 110

111

W=0 AL

 CL  DL  BL  AH

 CH  DH  BH

W=1 AX

 CX  DX  BX  SP

 BP  SI  DI


     ## 활용 팁

    굳이 외울 필요는 없겠지만 W=0인 경우 바이트 데이터를 취급하기 때문에

    8비트 레지스터만 표시할  수 밖에 없음은 당연하며, 바이트 레지스터의

    경우 먼저 하위  바이트에서 ACDB 순서로, 그 다음에는 상위 바이트에서

    같은 순서로, 워드 레지스터의 경우에도 같은 순서로, 마지막으로 SBSD 포인트

    인덱스 레지스터 순서로 기억하면 저절로 외워진다.







이론적인 설명만 계속되어 지루한 감이 있을 것이므로, 실습을 해 보자.

...> debug <Enter>

- a <Enter>

????:0100 mov ah,

33 <Enter>

????:0102 mov cx,

ff8a <Enter>

????:0105 <Enter>

- u <Enter>

????:0100 B433  MOV

AH,33

????:0102 B98AFF  MOV CX,FF8A

...............................

- q <Enter>

...>

워드 데이터 FF8A가 바이트  단위로 높은 바이트부터 저장되었기 때문에

기계어 코드에서는 8AFF로 나타났다는 사실은 다 알고 있을 것이다.

역어셈블한 2줄의 제1바이트를 2진수로 바꾸고 4, 1, 3비트로 나누어 보자.

????:0100 (1011  0  100) 33

MOV AH,33

????:0102 (1011  1  001) 8AFF

MOV CX,FF8A

OP코드

W  REG

이렇게 분석해 보니 첫 줄은  바이트 데이터를 취급하고 둘째 줄은 워드

데이터를 취급했다는 사실이 W 비트에 나타나 있음이 확인되었으며, 첫 줄에서는

레지스터 AH를 표시하는 100(b)가  입력되었고 둘째 줄에서는 레지스터 CX를

표시하는 001(b)가 입력되어 있음을 확인할 수 있을 것이다.






6) 제6형식

다음 형식은 제5형식의 W 비트가 없어지고, 그 대신 OP 코드가 5비트이다.

제1바이트 = OP 코드(5) + REG(3)

이 형식은 push,  pop, xchg(exchange), inc(rement), dec(rement) 명령

등에서 사용되는 명령 구성이다.

push, pop 명령의 오퍼랜드 레지스터는 항상 워드가 된다. xchg, inc, dec 명령은

바이트 또는 워드 레지스터를 오퍼랜드로 취할 수 있다.


7) 제7형식

이번 형식은 세그먼트 레지스터를 다루는 명령 형식이다.

제1바이트 = OP 코드(3) + SEG(2) + (3)

이 형식은 push, pop, segment override prefix 명령 등에서 사용된다.


     ## 발전 참고

    segment override prefix 명령은 물리 번지를 산출할 때 기본(default)으로

    지정된 세그먼트  이외의 세그먼트 레지스터가 오프셋과 합해지도록 하는

    명령으로 독립된 명령이 아니라 다른 명령어 앞에 부가되는 명령어이기 때문에

    prefix 명령이라고 하는 것이다. 그 명령의 예는 뒤에 설명할 구체적인 명령

    해설을 참고하기 바란다.







4. 명령어 제2바이트 이후의 인코딩

명령어의 제2바이트는 일반적으로 오퍼랜드를 지정하는 데 사용된다.

명령어 제1바이트에는 다음과 같은 3가지 형식이 있다.

제1형식 = MOD(2) + REG(3) + R/M(3)

제2형식 = MOD(2) + 0(1) + SEG(2) + R/M(3)

제3형식 = MOD(2) + (3) + R/M(3)


1) MOD 영역

오퍼랜드 2개가 모두 레지스터인지, 오퍼랜드 1개는 메모리인지를 표시한다.

MOD=11인 경우에만 2개의 오퍼랜드가 모두 레지스터이다.

MOD 모드

 displacement

00  메모리

모드 없음

01  메모리

모드 8비트

10  메모리

모드 16비트

11  레지스터

모드 없음


2) REG 영역

REG 영역은 일반적으로 오퍼랜드 중 하나로 사용되는 레지스터의 종류를 표시하지만,

immediate-to-memory 명령의 경우에는 명령의 기능을 나타내는 OP 코드의 확장으로

사용된다.

레지스터 영역 3비트의 인코딩은 다음과 같다.

REG(3)  000 001

010 011 100 101 110

111

W=0 AL

 CL  DL  BL  AH

 CH  DH  BH

W=1 AX

 CX  DX  BX  SP

 BP  SI  DI






3) R/M 영역

R/M 영역의 기능은 MOD 영역에 의존한다.

즉 MOD=11인 경우에는 R/M이 두 번째 오퍼랜드인 레지스터의 종류를 표시한다.

따라서 그런 경우에는 다음과 같은 형식이 될 것이다.

제1형식 = MOD(2) + REG1(3) + R/M 즉 REG2(3)

위와 같은  경우(MOD=11)에 R/M 값이 표시하는  레지스터의 종류는

앞 항목(REG 영역)에서 제시한 레지스터 영역 인코딩을 참고하기 바란다.

그 이외의 경우,  즉 MOD가 00, 01, 10인  경우에는 다음과 같이 실효

번지(EA, Effective Address)를 계산하는 방법을 나타내는 데 사용된다.

R/M MOD=00

 MOD=01  MOD=10

000 [BX+SI]

[BX+SI+disp8] [BX+SI+disp16]

001 [BX+DI]

[BX+DI+disp8] [BX+DI+disp16]

010 [BP+SI]

[BP+SI+disp8] [BP+SI+disp16]

011 [BP+DI]

[BP+DI+disp8] [BP+DI+disp16]

100 [SI]

 [SI+disp8]

 [SI+disp16]

101 [DI]

 [DI+disp8]

 [DI+disp16]

110 직접번지지정

 [BP+disp8]  [BP+disp16]

111 [BX]

 [BX+disp8]

 [BX+disp16]

MOD=00의 경우만 알면 MOD=01, MOD=10의 경우는 쉽게 알 수 있을 것이다.






4) 명령어 제3 내지 제4바이트

명령어의 제3,4바이트는 메모리  번지지정을 위한 displacement 또는 immediate

data로 사용된다.

displacement로서는 8비트 또는 16비트  모두 사용될 수 있지만, 어셈블러는

가능하면 8비트로 번역하고 부득이한 경우에만 16비트로 번역하도록 되어 있으며,

이를 제2바이트의 MOD 영역에도 표시한다.

immediate data는  어셈블리 명령에 따라 8비트  또는 16비트로 결정되며,

이를제1바이트의 W 영역에도 표시한다.

displacement 또는 immediate data가 16비트일 경우에는 메모리 상에서 항상 역워드(逆word)

순서로 배열 저장된다.


     ## 활용 팁

    역워드 순서란 워드의 상위 바이트가 메모리상의 높은 번지에 저장되는 모양으로,

    앞에서 본 ????:0102 B98AFF  MOV CX,FF8A의 예와 같다.



5) 명령어 제5 내지 제6바이트

명령어의 제5,6바이트는 8비트 또는 16비트 immediate data로 사용된다.

인코딩 방법은 제3,4바이트에서 설명한 것과 같다.






제 2 절  명령어의 종류

인텔 8088/8086 명령어 세트를 기능별로 분류해 보면 다음과 같다.

데이터 전송 명령

산술 연산 명령

비트 조작 명령

스트링 명령

프로그램 전송 명령

프로세서 제어 명령

각 종류에 어떤 명령이 있는지 알아 보자.


1. 데이터 전송 명령

범용 데이터 전송  : MOV, XCHG, PUSH,

POP, XLAT

입출력  :

IN, OUT

어드레스 전송 :

LEA, LDS, LES

플래그 전송 :

LAHF, SAHF, PUSHF, POPF


2. 산술 연산 명령

가산  :

ADD, ADC, INC, AAA, DAA

감산  :

SUB, SBB, DEC, NEG, CMP, AAS, DAS

승산  :

MUL, IMUL, AAM

제산  :

DIV, IDIV, AAD, CBW, CWD






3. 비트 조작 명령

논리 연산 :

NOT, AND, OR, XOR, TEST

비트 이동 :

SHL/SAL, SHR, SAR

비트 회전 :

ROL, ROR, RCL, RCR


4. 스트링 명령

Repeat Prefix :

REP, REPE/REPZ, REPNE/REPNZ

블록 데이터 처리  : MOVSB/MOVSW,

CMPSB/CMPSW, SCASB/SCASW,

LODSB/LODSW,

STOSB/STOSW


5. 프로그램 전송 명령

무조건 전송 : JMP, CALL, RET

조건부 전송 : JA/JNBE, JAE/JNB, JB/JNAE, JBE/JNA,

JC, JE/JZ,

JG/JNLE,

JGE/JNL, JL/JNGE, JLE/JNG, JNC, JNE/JNZ,

JNO,

JNP/JPO, JNS, JO, JP/JPE, JS

반복 제어 : LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ,

JCXZ

인터럽트  : INT, INTO, IRET


6. 프로세서 제어 명령

플래그 제어 :

STC, CLC, CMC, STD, CLD, STI, CLI

외부 동기 제어  : HLT,

WAIT, ESC, LOCK

No Operation  :

NOP






제 3 절  명령어 색인

필자가 어셈블리 참고서를 보면서 가장 어렵게 느꼈던 부분이 어떤 명령어를 찾아

보고 싶을 때 색인이  없는 점이었다. 본문 설명은 대개 명령어의 용도에 따라

쳬계적으로 진행하면서 책 뒤나 어디에도 색인이 없는 참고서는 무조건 순서대로

공부하든지 어쨌든 어느 정도  윤곽을 잡고 난 후에라야 수시로 궁금한 부분을

찾아 볼 정도의 힘이  생기는데, 많은 사람은 그 정도의 힘이 생기기 이전에

이미 지쳐서 헤매지 않을까 염려된다.

필자는 아예 8088 명령어를 ABC 순서로 해설하기로 한다.

동시에 색인으로 각 명령어가 어떤 분류에 속하는지를 연결시켜 두겠다.

먼저 명령어 이름만으로 색인을  제공하고, 이어서 각 명령이 어떤 명령

종류의 어떤 그룹에 속하는지를 명시한 다른 색인을 제공한다.


<

명령 이름 색인 >

1.  AAA 2.  AAD

3.  AAM 4.

 AAS

5.  ADC 6.  ADD

7.  AND 8.

 CALL

9.  CBW 10. CLC

11. CLD 12.

CLI

13. CMC 14. CMP

15. CMPSB 16. CMPSW

17. CWD 18. DAA

19. DAS 20.

DEC

21. DIV 22. ESC

23. HLT 24.

IDIV

25. IMUL  26. IN

 27. INC 28.

INT

29. INTO  30. IRET

 31. JA  32.

JAE

33. JB  34. JBE

35. JC  36.

JCXZ

37. JE  38. JG

 39. JGE 40.

JL

41. JLE 42. JMP

43. JNA 44.

JNAE

45. JNB 46. JNBE

 47. JNC 48.

JNE

49. JNG 50. JNGE

 51. JNL 52.

JNLE

53. JNO 54. JNP

55. JNS 56.

JNZ

57. JO  58. JP

 59. JPE 60.

JPO

61. JS  62. JZ

 63. LAHF  64.

LDS

65. LEA 66. LES

67. LOCK  68.

LODSB

69. LODSW 70. LOOP

 71. LOOPE 72. LOOPNE

73. LOOPNZ  74. LOOPZ

75. MOV 76. MOVSB

77. MOVSW 78. MUL

79. NEG 80.

NOP

81. NOT 82. OR

 83. OUT 84.

POP

85. POPF  86. PUSH

 87. PUSHF 88. RCL

89. RCR 90. REP

91. REPE  92.

REPNE

93. REPNZ 94. REPZ

 95. RET 96.

ROL

97. ROR 98. SAHF

 99. SAL 100.

 SAR

101.SBB 102.  SCASB

103.  SCASW 104.  SHL

105.SHR 106.  STC

107.  STD 108.

 STI

109.STOSB 110.  STOSW

111.  SUB 112.  TEST

113.WAIT  114.  XCHG

 115.  XLAT  116.  XOR






다음에 소개할 명령 분류 색인은 다음 절(명령어 사용법 요약)의 내용을 참고할

필요가 있을 때 쉽게 찾아 볼 수 있도록 도움을 줄 것이다.


<명령

분류 색인>

1.  AAA 21(산술 연산

명령-가산)

2.  AAD 24(산술 연산

명령-제산)

3.  AAM 23(산술 연산

명령-승산)

4.  AAS 22(산술 연산

명령-감산)

5.  ADC 21(산술 연산

명령-가산)

6.  ADD 21(산술 연산

명령-가산)

7.  AND 31(비트 조작

명령-논리 연산)

8.  CALL  51(프로그램 전송

명령-무조건 전송)

9.  CBW 24(산술 연산

명령-제산)

10. CLC 61(프로세서 제어

명령-플래그 제어)

11. CLD 61(프로세서 제어

명령-플래그 제어)

12. CLI 61(프로세서 제어

명령-플래그 제어)

13. CMC 61(프로세서 제어

명령-플래그 제어)

14. CMP 22(산술 연산 명령-감산)

15. CMPSB 42(스트링 명령-블록 데이터

처리)

16. CMPSW 42(스트링 명령-블록 데이터

처리)

17. CWD 24(산술 연산 명령-제산)

18. DAA 21(산술 연산 명령-가산)

19. DAS 22(산술 연산 명령-감산)

20. DEC 22(산술 연산 명령-감산)

21. DIV 24(산술 연산 명령-제산)

22. ESC 62(프로세서 제어

명령-외부 동기 제어)

23. HLT 62(프로세서 제어

명령-외부 동기 제어)

24. IDIV  24(산술 연산 명령-제산)

25. IMUL  23(산술 연산 명령-승산)

26. IN  12(데이터 전송

명령-입출력)

27. INC 21(산술 연산 명령-가산)

28. INT 54(프로그램 전송

명령-인터럽트)

29. INTO  54(프로그램 전송 명령-인터럽트)

30. IRET  54(프로그램 전송 명령-인터럽트)

31. JA  52(프로그램

전송 명령-조건부 전송)

32. JAE 52(프로그램 전송

명령-조건부 전송)

33. JB  52(프로그램

전송 명령-조건부 전송)

34. JBE 52(프로그램 전송

명령-조건부 전송)

35. JC  52(프로그램

전송 명령-조건부 전송)

36. JCXZ  53(프로그램 전송 명령-반복

제어)

37. JE  52(프로그램

전송 명령-조건부 전송)

38. JG  52(프로그램

전송 명령-조건부 전송)

39. JGE 52(프로그램 전송

명령-조건부 전송)

40. JL  52(프로그램

전송 명령-조건부 전송)

41. JLE 52(프로그램 전송

명령-조건부 전송)

42. JMP 51(프로그램 전송

명령-무조건 전송)

43. JNA 52(프로그램 전송

명령-조건부 전송)

44. JNAE  52(프로그램 전송 명령-조건부

전송)

45. JNB 52(프로그램 전송

명령-조건부 전송)

46. JNBE  52(프로그램 전송 명령-조건부

전송)

47. JNC 52(프로그램 전송

명령-조건부 전송)

48. JNE 52(프로그램 전송

명령-조건부 전송)

49. JNG 52(프로그램 전송

명령-조건부 전송)

50. JNGE  52(프로그램 전송 명령-조건부

전송)

51. JNL 52(프로그램 전송

명령-조건부 전송)

52. JNLE  52(프로그램 전송 명령-조건부

전송)

53. JNO 52(프로그램 전송

명령-조건부 전송)

54. JNP 52(프로그램 전송

명령-조건부 전송)

55. JNS 52(프로그램 전송

명령-조건부 전송)

56. JNZ 52(프로그램 전송

명령-조건부 전송)

57. JO  52(프로그램

전송 명령-조건부 전송)

58. JP  52(프로그램

전송 명령-조건부 전송)

59. JPE 52(프로그램 전송

명령-조건부 전송)

60. JPO 52(프로그램 전송

명령-조건부 전송)

61. JS  52(프로그램

전송 명령-조건부 전송)

62. JZ  52(프로그램

전송 명령-조건부 전송)

63. LAHF  14(데이터 전송 명령-플래그

전송)

64. LDS 13(데이터 전송 명령-어드레스

전송)

65. LEA 13(데이터 전송 명령-어드레스

전송)

66. LES 13(데이터 전송 명령-어드레스

전송)

67. LOCK  62(프로세서 제어 명령-외부

동기 제어)

68. LODSB 42(스트링 명령-블록 데이터

처리)

69. LODSW 42(스트링 명령-블록 데이터

처리)

70. LOOP  53(프로그램 전송 명령-반복

제어)

71. LOOPE 53(프로그램 전송 명령-반복

제어)

72. LOOPNE  53(프로그램 전송 명령-반복 제어)

73. LOOPNZ  53(프로그램 전송 명령-반복 제어)

74. LOOPZ 53(프로그램 전송 명령-반복

제어)

75. MOV 11(데이터 전송 명령-범용

데이터 전송)

76. MOVSB 42(스트링 명령-블록 데이터

처리)

77. MOVSW 42(스트링 명령-블록 데이터

처리)

78. MUL 23(산술 연산 명령-승산)

79. NEG 22(산술 연산 명령-감산)

80. NOP 63(프로세서 제어

명령-No Operation)

81. NOT 31(비트 조작 명령-논리

연산)

82. OR  31(비트 조작

명령-논리 연산)

83. OUT 12(데이터 전송 명령-입출력)

84. POP 11(데이터 전송 명령-범용

데이터 전송)

85. POPF  14(데이터 전송 명령-플래그

전송)

86. PUSH  11(데이터 전송 명령-범용

데이터 전송)

87. PUSHF 14(데이터 전송 명령-플래그

전송)

88. RCL 33(비트 조작 명령-비트

회전)

89. RCR 33(비트 조작 명령-비트

회전)

90. REP 41(스트링 명령-Repeat

Prefix)

91. REPE  41(스트링 명령-Repeat

Prefix)

92. REPNE 41(스트링 명령-Repeat Prefix)

93. REPNZ 41(스트링 명령-Repeat Prefix)

94. REPZ  41(스트링 명령-Repeat

Prefix)

95. RET 51(프로그램 전송

명령-무조건 전송)

96. ROL 33(비트 조작 명령-비트

회전)

97. ROR 33(비트 조작 명령-비트

회전)

98. SAHF  14(데이터 전송 명령-플래그

전송)

99. SAL 32(비트 조작 명령-비트

이동)

100.SAR 32(비트 조작 명령-비트

이동)

101.SBB 22(산술 연산 명령-감산)

102.SCASB 42(스트링 명령-블록 데이터

처리)

103.SCASW 42(스트링 명령-블록 데이터

처리)

104.SHL 32(비트 조작 명령-비트

이동)

105.SHR 32(비트 조작 명령-비트

이동)

106.STC 61(프로세서 제어

명령-플래그 제어)

107.STD 61(프로세서 제어

명령-플래그 제어)

108.STI 61(프로세서 제어

명령-플래그 제어)

109.STOSB 42(스트링 명령-블록 데이터

처리)

110.STOSW 42(스트링 명령-블록 데이터

처리)

111.SUB 22(산술 연산 명령-감산)

112.TEST  31(비트 조작 명령-논리

연산)

113.WAIT  62(프로세서 제어 명령-외부

동기 제어)

114.XCHG  11(데이터 전송 명령-범용

데이터 전송)

115.XLAT  11(데이터 전송 명령-범용

데이터 전송)

116.XOR 31(비트 조작 명령-논리

연산)






제 4 절  명령어 사용법 요약

다음 장으로부터 8088 명령어를 ABC 순서로 해설하기로 한다.

그러나 명령어 사용법을 어느 정도  알고 나면, 가끔 어떤 용도에 사용할

수 있는 명령어의 이름이 생각나지 않아서 찾아 보기 어려운 경우도 있을 것이다.

그 때 이 절의 명령어 사용법 요약 설명을 참고하면 시간을 아낄 수 있다.

이하 각 명령어의 오퍼랜드 약어의 뜻은 다음과 같다.


acc(accumulator)  : 어큐뮬레이트를

통칭함, 경우에 따라 AL, AX

count : 카운터(counter),

경우에 따라 1 또는 CL 레지스터

d(destination)  : 목적

오퍼랜드(operand)를 통칭함

disp8 : 8비트

displacement

disp16  : 16비트 displacement

imm8  :

8비트 즉치(immediate) 데이터

imm16 : 16비트

즉치(immediate) 데이터

label : 실행이

넘어갈 표적(target)이 되는 표지(label)

mem8  :

8비트 데이터가 저장된 메모리 위치(location)

mem16 : 16비트

데이터가 저장된 메모리 위치(location)

mem32 : 32비트

데이터가 저장된 메모리 위치(location)

operation : 어셈블리 명령의 mnemonic

code

port  :

입출력 포트(I/O port)

reg8  :

8비트 범용 데이터 레지스터(AH,AL,BH,BL,CH,CL,DH,DL)

reg16 : 16비트

범용 레지스터(AX,BX,CX,DX,SP,BP,SI,DI)

s(source) : 원본(source) 오퍼랜드를 통칭함

seg :

세그먼트 레지스터

type  :

소프트웨어 인터럽트의 타입(00h 내지 FFh)


입출력 포트 표시에는 8비트 즉치 데이터 또는 DX 레지스터가 사용된다.

오퍼레이션 명령의 니모닉  코드로 prefix 명령에서는 8088/8086의 명령을

사용하고, ESC 명령에서는 8087/8089의 명령을 사용한다.

레이블(label)은 call, jmp, loop 등 명령의 표적(target)이 된다.

dssp8, disp16은 형식으로 보면 레이블이지만 기계어 코드로는 8비트/16비트 즉치

데이터가 되어 2의 보수(2's complement)로 표현되어 -128 내지 +127/-32768 내지

+32767 범위의 값을 가지게 된다.

약어를 알 수 없으면 ABC 순서로 빨리 찾아 보고 참고할 수 있을 것이다.






1. 데이터 전송 명령

8088의 데이터 전송 명령(Data Transfer Instruction)은 레지스터, 메모리, I/O

포트(port) 사이에서 데이터를 전송하기 위한 명령으로 14개가 있다.


1) 범용 데이터 전송 명령(General Purpose Data Transfer)

MOV d,s : s의 바이트나 워드를

d로 전송(복사)

XCHG  d,s : s와 d의 바이트, 또는

s와 d의 워드를 맞바꿈(교환)

PUSH  s : 워드 주소를

스택에 저장

POP d : 스택에

저장된 워드 주소를 복구

XLAT  :

(BX+AL)로 표시되는 메모리 번지의 내용을 AL로 전송


     ## 활용 팁

    push, pop 명령은 항상 워드(16비트) 데이터만을 저장, 복구한다. 플래그

    레지스터의 저장과 복구는 플래그 전송 명령을 참고하라.



2) 입출력 명령(Input/Output)

IN  acc,port  :

지정된 포트에서 바이트/워드 데이터를 AX에 전송

OUT port,acc  :

AL/AX의 바이트/워드 데이터를 지정된 포트로 출력


3) 어드레스 전송 명령(Address Object Transfer)

LEA reg16,s(mem16)

: s의 EA(오프셋, 유효 주소)를

레지스터로 전송

LDS reg16,s(mem32)

: s의 32비트 데이터  중

하위 워드는 reg16으로 지정된 16비트 레지스

터로 전송하고,

상위 워드는 DS 레지스터로 전송

LES reg16,s(mem32)

: s의 32비트 데이터  중

하위 워드는 reg16으로 지정된 16비트 레지스

터로 전송하고,

상위 워드는 ES 레지스터로 전송


4) 플래그 전송 명령(Flag Transfer)

LAHF  : 플래그의 하위 바이트를 AH 레지스터로 전송

SAHF  : AH 레지스터 데이터를 플래그의 하위 바이트에 저장

PUSHF : 플래그 레지스터 데이터를 스택에 저장

POPF  : 스택 데이터를 플래그 레지스터로 복구






2. 산술 연산 명령

8088의 산술 연산 명령(Arithmetic Instruction)에는 덧셈, 뺄셈, 곱셈, 나눗셈

의 사칙연산을 수행하기 위한 20개의 명령이 있다.


1) 가산 명령(Addition)

ADD d,s : 바이트/워드 단위로

(d+s)를 d에 저장

ADC d,s : 바이트/워드 단위로

(d+s+CF)를 d에 저장

INC d : 바이트/워드

데이터를 1만큼 증가시킴

AAA :

AL을 unpacked BCD로 변환

DAA :

AL을 packed BCD로 변환


     ## 활용 팁

    캐리 플래그는 0,1 중  하나이므로 adc 명령의 결과는 add 명령의 결과와

    같거나 1만큼 차이가 날 것이다.



2) 감산 명령(Subtraction)

SUB d,s : 바이트/워드 단위로

(d-s)를 d에 저장

SBB d,s : 바이트/워드 단위로

(d-s-CF)를 d에 저장

DEC d : 바이트/워드

데이터를 1만큼 감소

NEG d : 2의 보수

계산(0-d)으로 부호 있는 수의 부호를 바꾼다

CMP d,s : (d-s)의 계산 결과

상태만을 플래그 레지스터에 저장

AAS :

AL을 非밀집형(unpacked) BCD로 변환

DAS :

AL을 密集形(packed) BCD로 변환

cmp 명령은 산술적 비교에 쓰이며, 논리적 비교 명령은 test이다.


     ## 활용 팁

    캐리 플래그는 0,1 중  하나이므로 sbb 명령의 결과는 sub 명령의 결과와

    같거나 1만큼 차이가 날 것이다.







3) 승산 명령(Multiplication)

MUL s : 어큐뮬레이터와

소스를 부호 없는 수로 간주하고 곱한다.

IMUL  s : 어큐뮬레이터와

소스를 부호 있는 수로 간주하고 곱한다.

AAM :

AL을 unpacked BCD로 변환


     ## 활용 팁

    mul, imul 명령에서 바이트 단위의 곱셈은 AL*source=AX(AH,AL)과 같이 곱셈

    결과가 AX 레지스터에 저장되고, 워드 단위의 곱셈은 AX*source의 결과 값을

    DX, AX 레지스터에 저장하게 된다.



4) 제산 명령(Division)

DIV s : 어큐뮬레이터에서

소스를 부호 없는 수로 간주하고 나눈다.

IDIV  s : 어큐뮬레이터에서

소스를 부호 있는 수로 간주하고 나눈다.

AAD :

AX의 unpacked BCD 데이터를 2진수로 변환하여 AL에 저장

CBW :

AL 레지스터의 바이트 데이터를 AX 워드 데이터로 확장

CWD :

AX 워드 데이터를 DX:AX 더블 워드 데이터로 확장






3. 비트 조작 명령

8088의 비트 조작 명령(Bit Manipulation Instruction)은 논리 연산 명령, 비트

이동(시프트) 명령, 비트 회전(로테이트) 명령 등 12개가 있다.


1) 논리 연산 명령(Logical)

NOT d : 각 비트의

1은 0으로, 0은 1로 바꾸어 1의 보수를 만든다.

AND d,s : (d and s) 즉 논리곱(and)을

구하여 d에 저장

OR  d,s : (d or s) 즉

논리합(or)을 구하여 d에 저장

XOR d,s : (d xor s) 즉 배타적

논리합(xor)을 구하여 d에 저장

TEST  d,s : 논리곱(d and s)의 결과

상태만을 플래그 레지스터에 저장


2) 비트 이동 명령(Shift)

SHL d,count : 바이트/워드의 각 비트를 count 비트만큼

왼쪽으로 이동

SAL d,count : 바이트/워드의 각 비트를 count 비트만큼

왼쪽으로 이동

SHR d,count : 바이트/워드의 각 비트를 count 비트만큼

오른쪽으로 이동

SAR d,count : 바이트/워드의 각 비트를 count 비트만큼

오른쪽으로 이동


     ## 활용 팁

    왼쪽 시프트 명령은  둘 다 부호를 고려하지  않으므로 shl 명령과

    sal 명령은 전혀 동일하다. 그러나, 오른쪽 시프트 명령 중에서 shr 명령은부호를

    고려하지 않는 반면 sar 명령은 부호를 고려하는 차이가 있다. 자세한 내용은

    각 명령 해설을 참고하기 바란다.







3) 비트 회전 명령(Rotate)

ROL d,count : 바이트/워드의 각 비트를 count 비트만큼

왼쪽으로 회전

ROR d,count : 바이트/워드의 각 비트를 count 비트만큼

오른쪽으로 회전

RCL d,count : 바이트/워드의 각 비트를 count 비트만큼

왼쪽으로 회전

RCR d,count : 바이트/워드의 각 비트를 count 비트만큼

오른쪽으로 회전


     ## 활용 팁

    비트 이동의 결과 밀려난  비트는 원래 데이터로 되돌아오지 못하는

    반면 비트 회전에서는 그것이 원래 데이터로 되돌아오는 점이 다르다.




     ## 활용 팁

    rcl, rcr 명령은 캐리  플래그도 순환 고리에 한 자리를 차지한다는

    점이 rol, ror 명령과 다르다. 즉 rol, ror 명령을 사용하면 회전으로 밀려난

    비트가 바로 반대편  비트로 저장되지만, rcl, rcr 명령을 사용하는 경우에는

    그 비트가  캐리 플래그에 저장되었다가 다음 비트의 회전에서 반대편 비트를

    채우게 된다는 사실을 이해하면 될 것이다.







4. 스트링 명령

스트링 명령(String Instruction)은 반복처리 접두어(repeat prefix) 및 데이터의

블록 전송(move), 비교(compare), 검색(scan)에 관한 명령으로 7개가 있다.


1) Repeat Prefix 명령

REP opcode  : OP 코드(MOVS, STOS)를 CX 회수

반복 실행

REPE  opcode  : OP 코드(CMPS, SCAS)를 ZF=1인 동안 CX

회수 반복 실행

REPZ  opcode  : OP 코드(CMPS, SCAS)를 ZF=1인 동안 CX

회수 반복 실행

REPNE opcode  : OP 코드(CMPS, SCAS)를 ZF=0인 동안 CX 회수

반복 실행

REPNZ opcode  : OP 코드(CMPS, SCAS)를 ZF=0인 동안 CX 회수

반복 실행

rep는 무조건 명령이지만, 나머지는 캐리 플래그를 참조하는 조건부 명령이다.

Repeat Prefix 명령은 독립하여  사용될 수는 없으며, 뒤에 따라 나오는

명령을 무조건 또는 조건부로 CX 레지스터에 저장된 회수만큼 반복 실행하게 만드는

것이므로 일종의 명령 접두어 역할을 하는 것임을 이해할 필요가 있다.



     ## 활용 팁

    아무 명령 앞에나 rep(e, z, ne, nz)를 붙여서는 안 된다.







2) 블록 데이터 처리 명령

데이터를 바이트 블록 또는 워드 블록 단위로 전송, 비교하는 블록 데이터 처리

명령의 이름에서 끝의 s는 스트링(String)을 표시하며, b는 바이트, w는 워드를 나타낸다는

사실을 이해하고 보면 간단해질 것이다.

MOVSB : DS:SI에 저장된 바이트 데이터를 ES:DI로 전송

MOVSW : DS:SI에 저장된 워드 데이터를 ES:DI로 전송

CMPSB : (DS:SI - ES:DI)로 비교한 결과 상태를 플래그 레지스터에

저장

CMPSW : (DS:SI - ES:DI)로 비교한 결과 상태를 플래그 레지스터에

저장

SCASB : (accumulator - ES:DI) 비교 결과 상태를 플래그 레지스터에

저장

SCASW : (accumulator - ES:DI) 비교 결과 상태를 플래그 레지스터에

저장

LODSB : DS:SI에 저장된 바이트 데이터를 어큐뮬레이트로 전송

LODSW : DS:SI에 저장된 워드 데이터를 어큐뮬레이트로 전송

STOSB : 어큐뮬레이트의 바이트 데이터를 ES:DI로 전송

STOSW : 어큐뮬레이트의 워드 데이터를 ES:DI로 전송


     ## 주의


cmpsb/cmpsw 명령은 소스 오퍼랜드에서 목적 오퍼랜드를 빼는 방식으로 두 데이터를

비교하기 때문에,  그 비교 연산 방향이 cmp 명령에서 (목적-소스)로 비교하는

것과 정반대임을 주의하자.



     ## 활용 팁

    각 명령에서 바이트/워드를 표시하는  b, w를 붙이지 않고 movs,

    cmps, scas, lods, stos와 같이 명령하면 처리할 데이터가 바이트 데이터인지

    워드 데이터인지를 어셈블러가  알아서 판단하고 바이트 명령, 워드 명령으로

    번역하여 준다.







5. 프로그램 전송 명령

프로그램 전송 명령(Program Transfer  Instruction)은 IP 및 CS의 내용을

변화시켜 프로그램의 흐름을 변경하는 것으로 26개의 명령이 있다.


1) 무조건 전송 명령(Unconditional Transfer)

JMP label : 지정된 레이블 위치로 이동

CALL  label : 부프로그램(procedure, subroutine)을

호출

RET imm16 : 부프로그램(procedure, subroutine)에서

복귀


     ## 활용 팁

    ret  명령에 imm16  오퍼랜드를 붙이면  서브루틴에서 복귀한

     후 SP를 imm16만큼 증가시킨다.



2) 조건부 전송 명령(Conditional Transfer)

조건부 전송 명령은 모두 동일하게 disp8(8비트 displacement)를 하나의 오퍼랜

드로 취하여 IP+disp8을 새로운 IP로 바꾸며, 따라서 상대 주소 -128 내지 +127


범위 내에 존재하는 레이블로 분기하는 short jump 명령이다.






 ## 활용 팁

어셈블리어로 소스를 만들 때는 레이블 이름을 입력하면

될 것이다.

조건부 전송 명령은 개수가 많아  처음 대할 때 혼란스럽게 느껴질 우려가

있기는 하지만, 같은 의미로 쓰이는 동일한 명령어를 합치기만 해도 거의 절반 정도로

줄어지며, 그 후에 잘 살펴 보면 간단하게 2가지 부류로 나누어진다.

첫째, 두 데이터의 비교 결과를 조건으로 전송 여부

결정

둘째, OF, SF, PF의 값이 1인지 0인지를 조건으로 전송

여부 결정

두 데이터의 비교 결과는 크다 또는 많다, 작다 또는 적다, 같다 등 3가지의 기본

조건을 형성한다. 그 외에 작지 않다 또는 적지 않다(이상), 크지 않다 또는 많지

않다(이하) 등 2가지의 복합 조건이 추가된 정도이다.

크다(많다)  |

+-------------

 작지(적지) 않다

같다  |

|

+-----

 크지(많지) 않다

작다(적다)  |

그리고 모든 명령의 첫 글자는  jump의 j를 따서 붙인 것이며, 자주 보이는

n은 no 또는 not를 표시하고,  그 나머지 글자들은 a(bove), b(elow), e(qual)

등과 g(reater), l(ess) 등의 비교 결과 표시 및 c(arry), z(ero), o(verflow) 등

플래그 상태를 표시하는 단어의 첫 글자들로 조합되어 있다.

이 정도만 이해하고 보면 별로 어렵지 않게 이해할 수 있을 것이다.

좀 더 보기 쉽도록 몇 그룹으로 나누어 요약한다.

<1> 크거나 작은 조건

<2> 많거나 적은 조건

<3> 같거나 같지 않은 조건

<4> 제로 플래그 조건

<5> 사인 플래그 조건

<6> 패리티 플래그 조건






이제 각 그룹을 나누어 해당되는 명령어를 살펴 보자.

<1> 크거나 작은 조건

JA  label : above(더 큼) 조건이

만족(CF=0, ZF=0)되면 분기

JNBE  label : 위와 같음(not below & not

equal)

JAE label : 이상(above 또는 equal) 조건이

만족(CF=0)되면 분기

JNB label : 위와 같음

JNC label : 위와 같음

JB  label : below(더 작음) 조건이

만족(CF=1)되면 분기

JNAE  label : 위와 같음

JC  label : 위와 같음

JBE label : 이하(below 또는 equal) 조건(CF=1

또는 ZF=1)이면 분기

JNA label : 위와 같음

 ## 발전 참고

jc, jnc는 원래 8088/8086의 명령어표에는 정의되어

있지 않다. 그러나 MASM에서는 그 명령들을 지원한다.

<2> 많거나 적은 조건

JG  label : greater(더 많음) 조건이

만족되면 분기

JNLE  label : 위와 같음(<SF xor OF>=0,

ZF=0 조건)

JGE label : 이상(greater 또는 equal)

조건이 만족되면 분기

JNL label : 위와 같음(<SF xor OF>=0

조건)

JL  label : less(더 적음) 조건이

만족되면 분기

JNGE  label : 위와 같음(<SF xor OF>=1

조건)

JLE label : 이하(less 또는 equal) 조건이

만족되면 분기

JNG label : 위와 같음(<SF xor OF>=1

또는 ZF=1 조건)

JE  label : 같음(equal) 조건이 만족(ZF=1)되면

분기

<3> 같거나 같지 않은 조건

JZ  label : 위와 같음

JNE label : 같지 않음(not equal) 조건이

만족(ZF=0)되면 분기

JNZ label : 위와 같음

<4> 제로 플래그 조건

JO  label : OF=1이면 분기

JNO label : OF=0이면 분기

<5> 사인 플래그 조건

JS  label : SF=1이면 분기

JNS label : SF=0이면 분기

<6> 패리티 플래그 조건

JP  label : PF=1이면 분기

JPE label : 위와 같음

JNP label : PF=0이면 분기

JPO label : 위와 같음






3) 반복 제어 명령(Iteration Control)

반복 제어 명령도 모두 동일하게 disp8(8비트 displacement)를 하나의 오퍼랜드로

취하여 IP+disp8을  새로운 IP로 바꾸며, 따라서  상대 주소 -128 내지

+127 범위 내에 존재하는 레이블로 분기하는 short jump 명령이다.

LOOP  label : CX-1을 CX에 저장하고, 바뀐 CX가

0이 아니면 레이블로 분기

하지만

바뀐 CX=0이면 반복 실행을 끝낸다.

LOOPE label : 바뀐  CX가 0이 아닌 동시에  ZF=1이면

레이블로 분기하지만

바뀐

CX=0이거나 ZF=0이면 반복 실행을 끝낸다.

LOOPZ label : 위와 같음

LOOPNE  label : 바뀐  CX가 0이 아닌 동시에  ZF=0이면

레이블로 분기하지만

바뀐

CX=0이거나 ZF=1이면 반복 실행을 끝낸다.

LOOPNZ  label : 위와 같음

JCXZ  label : CX=0이면 레이블로 분기

 ## 활용 팁

반복 제어 명령에서  jcxz만 CX=z(ero)를 조건으로

분기할 뿐 나머지는 모두 CX가 0이 아닌 것을 필수 조건으로 분기하는 명령들이다.


4) 인터럽트 명령(Interrupt)

인터럽트의 내용은 그  자체만으로도 방대하며, 우리가 실제 프로그래밍을

하려면 많이 이용할 수 있는 중요한 것이기 때문에 인터럽트에 관해서는 이 장에

이어지지 않는 별도 원고로 정리할 것이다.

INT type  : 소프트웨어 인터럽트

INTO  :

OF=1일 때 int 4와 같은 동작을 수행(조건부 인터럽트)

IRET  :

인터럽트 서비스 루틴을 끝내고 스택 주소로 복귀

참고로 인터럽트 타입 번호의 배당을 살펴 보면 다음과 같다.

0 내지 4(00h 내지 04h)  :

마이크로프로세서 내부용으로 지정

5 내지 31(05h 내지 1Fh) :

인텔의 향후 서비스용으로 예약

32 내지 255(20h 내지 FFh) : 사용자에게

개방되어 있음

예약된 번호 중에서 여러 개는 바이오스 인터럽트에 사용되고 있다.






6. 프로세서 제어 명령

프로세서 제어  명령(Processor Control Instruction)은 CPU  플래그의

제어 및 멀티 프로세싱 시스템에서 외부와의 동기를 취하기 위한 명령으로 12개가

있다.


1) 플래그 제어 명령(Flag Operation)

STC : CF에 1을 전송(SeT Carry flag)

CLC : CF에 0을 전송(CLear Carry flag)

CMC : CF가 0이면 1로 1이면 0으로 변경시킴(CoMplement

Carry flag)

STD : DF(방향 플래그)에 1을 전송(SeT Direction flag)

CLD : DF에 0을 전송(CLear Direction flag)

STI : IF에 1을 전송(SeT Interrupt enable flag)

CLI : IF에 0을 전송(CLear Interrupt enable flag)

 ## 활용 팁

방향 플래그가 세팅(=1)된 상태에서는 스트링 명령이

실행될 때마다 SI

와 DI가 감소(바이트 단위 1, 워드 단위 2)하게 된다.


2) 외부 동기 제어 명령(External Synchronization)

HLT : CPU 정지(Halt until interrupt or reset)

WAIT  : TEST 핀이 low인가를 조사(Wait for TEST pin active)

ESC operation :

외부 coprocessor의 명령어를 실행

LOCK  operation : 외부

coprocessor의 bus 사용을 금지


3) No Operation 명령

NOP : 아무 기능도 수행하지 않음(No OPeration)

No Operation 명령은 프로그램의  실행 과정에 짧은 지연 시간을 삽입하기

위해서 사용될 수도 있다.



ID:
PW:

     0 분
     2 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

백과넷 포탈 : 건강/법률(메인)/홈피/서식/조약/생활지혜

◁ 2002.9.1.~2021.4.11. ▷

관리자 연락(저작권 의심 신고) : 김병희 010-6204-4973 k8z7@hanmail.net