C H A P T E R

Chapter 2: 수의 체계

15
ㅔ

스트링 작업

공부할 내용

★ 스트링 명령

★ 스트링 명령이 사용하는 오퍼랜드

★ 스트링 명령이 사용할 SI, DI의 준비

★ 스트링 명령의 반복

★ 스트링 연산의 방향 지정

5개의 기본적인 스트링 명령

명령	첫째 오퍼랜드	둘째 오퍼랜드
MOVSB(W) CMPSB(W) SCASB(W) LODSB(W) STOSB(W)	Move Compare Scan Load Store	한 원소를 다른 원소에 복사하라 한 원소와 다른 원소를 비교하라 지정된 값을 찾기 위하여 스캔하라 AX(AL) 레지스터에 복사하라 AX(AL) 레지스터로부터 복사하라

★ 모든 스트링 명령은 2개의 오퍼랜드를 갖는다.

- SI와 DI : 스트링의 오프셋

명령	첫째 오퍼랜드	둘째 오퍼랜드
MOVSB MOVSW CMPSB CMPSW	SI 에 있는 오프셋 SI 에 있는 오프셋	DI 에 있는 오프셋 DI 에 있는 오프셋

스트링 명령에 사용될 SI와 DI의 준비

★ SI와 DI를 스트링 명령에 사용할 때

- SI는 데이터 세그먼트나 엑스트라 세그먼트에 있는 스트링을 지칭

(default: SI가 데이터 세그먼트를 지칭한다고 가정)

- DI는 엑스트라 세그먼트에 있는 스트링만을 지칭

★ 대부분 자료는 1개의 세그먼트에 저장될 수 있을 정도로 작다.

ASSUME  CS:CSEG, SS:SSEG, DS:DSEG, ES:DSEG

...........

; set up segment registers

MOV     AX, DSEG

MOV     DS, AX

MOV     ES, AX

스트링 명령의 반복: REP, REPE, REPNE

★ 5개의 기본 스트링 명령은  각각 바이트 단위 또는 워드 단위로 작업한다. 스트링 전체를 처리하려면 한 번에 한 바이트씩 또는 한 워드씩 처리하는 스트링 명령을 계속 반복하여 사용해야 한다.

★ 스트링 명령을 반복하여 사용하려면 REP(repeat) 명령을 그 스트링 명령의 바로 앞에 쓰면 된다.

REP     MOVSB

★ REP를 사용하려면 먼저 CX를 스트링 명령의 실행 횟수로 세트하여야 한다.

예) MOVSB를 100회 실행하려면 다음과 같이 한다.

MOV     CX, 100

REP     MOVSB

★ REP의 두 가지 변형된 형태

- REPE : CX가 0이 아닌 동안 그리고 비교되고 있는 바이트나 워드가 같은 동안에 반복된다.

- REPNE : CX가 0이 아닌 동안 그리고 비교되고 있는 바이트나    워드가 같지 않은 동안에 반복된다.

★ REPE = REPZ,  REPNE = REPNZ 이다.

스트링 연산의 방향 지정: CLD와 STD

예)	LEA     SI, STRING1

LEA	DI, STRING2

MOV    CX, 100

REP	MOVSB

∀ MOVSB 명령이 SI와 DI를 자동적으로 갱신한다.

★ SI와 DI의 갱신

- 스트링 명령은 한 번 실행된 후에 디렉션 플래그(DF)를 검사한다.

DF = 0 이면, 스트링 명령은 SI, DI를 1 또는 2 만큼 증가

DF = 1 이면, 스트링 명령은 SI, DI를 1 또는 2 만큼 감소

예 1)	LEA      SI, STRING1

LEA      DI, STRING2

MOV     CX, LENGTH STRING1

CLD

REP	MOVSB

예 2)	LEA      SI, STRING1+99

LEA      DI, STRING2+99

MOV     CX, LENGTH STRING1

STD

REP	MOVSB

★ 스트링을 후진방향으로 처리할 때, 맨 끝의 원소를 지칭하는 방법

; copy a string of bytes (backward)

LEA     SI, STRING1 + SIZE STRING1 - TYPE STRING1

LEA     DI, STRING2 + SIZE STRING2 - TYPE STRING2

MOV    CX, LENGTH STRING1

STD

REP  MOVSB

스트링의 복사: MOVSB와 MOVSW

★  ; copy a string of bytes (forward)

LEA     SI, STRING1

LEA     DI, STRING2

MOV    CX, LENGTH STRING1

CLD

REP   MOVSB

두 스트링의 비교: CMPSB와 CMPSW

★ CMPSB와 CMPSW 명령은 한 스트링을 다른 스트링과 비교한다.

예)  ; compare two strings for equality (forward)

LEA     SI, STRING1

LEA     DI, STRING2

MOV    CX, LENGTH STRING1

CLD

REPE	CMPSB

; if (strings are equal) : AX ← 0

; else:                  AX ← 1

JE       L1

MOV    AX, 1

JMP     L2

L1:    MOV    AX, 0

L2: