조립-문자열
이전 예제에서 이미 가변 길이 문자열을 사용했습니다. 가변 길이 문자열은 필요한만큼의 문자를 가질 수 있습니다. 일반적으로 우리는 두 가지 방법 중 하나로 문자열의 길이를 지정합니다.
- 문자열 길이를 명시 적으로 저장
- 센티넬 캐릭터 사용
위치 카운터의 현재 값을 나타내는 $ 위치 카운터 기호를 사용하여 문자열 길이를 명시 적으로 저장할 수 있습니다. 다음 예에서-
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
$는 문자열 변수 msg 의 마지막 문자 뒤의 바이트를 가리 킵니다 . 따라서,$-msg문자열의 길이를 제공합니다. 우리는 또한 쓸 수 있습니다
msg db 'Hello, world!',0xa ;our dear string
len equ 13 ;length of our dear string
또는 문자열 길이를 명시 적으로 저장하는 대신 후행 센티널 문자를 사용하여 문자열을 저장하여 문자열을 구분할 수 있습니다. 센티넬 문자는 문자열 내에 나타나지 않는 특수 문자 여야합니다.
예를 들면-
message DB 'I am loving it!', 0
문자열 지침
각 문자열 명령어에는 소스 피연산자, 대상 피연산자 또는 둘 다 필요할 수 있습니다. 32 비트 세그먼트의 경우 문자열 명령어는 ESI 및 EDI 레지스터를 사용하여 각각 소스 및 대상 피연산자를 가리 킵니다.
그러나 16 비트 세그먼트의 경우 SI 및 DI 레지스터는 각각 소스와 대상을 가리키는 데 사용됩니다.
문자열 처리를위한 5 가지 기본 지침이 있습니다. 그들은-
MOVS −이 명령어는 데이터의 1 바이트, 워드 또는 더블 워드를 메모리 위치에서 다른 위치로 이동합니다.
LODS−이 명령어는 메모리에서로드됩니다. 피연산자가 1 바이트이면 AL 레지스터에로드되고, 피연산자가 1 워드이면 AX 레지스터에로드되고 더블 워드가 EAX 레지스터에로드됩니다.
STOS −이 명령어는 레지스터 (AL, AX 또는 EAX)의 데이터를 메모리에 저장합니다.
CMPS−이 명령어는 메모리의 두 데이터 항목을 비교합니다. 데이터는 바이트 크기, 워드 또는 더블 워드 일 수 있습니다.
SCAS −이 명령어는 레지스터 (AL, AX 또는 EAX)의 내용을 메모리에있는 항목의 내용과 비교합니다.
위의 각 명령어에는 바이트, 워드 및 더블 워드 버전이 있으며 반복 접두사를 사용하여 문자열 명령어를 반복 할 수 있습니다.
이러한 명령어는 ES : DI 및 DS : SI 레지스터 쌍을 사용합니다. 여기서 DI 및 SI 레지스터에는 메모리에 저장된 바이트를 참조하는 유효한 오프셋 주소가 포함됩니다. SI는 일반적으로 DS (데이터 세그먼트)와 연관되고 DI는 항상 ES (추가 세그먼트)와 연관됩니다.
DS : SI (또는 ESI) 및 ES : DI (또는 EDI) 레지스터는 각각 소스 및 대상 피연산자를 가리 킵니다. 소스 피연산자는 DS : SI (또는 ESI)에 있고 대상 피연산자는 메모리의 ES : DI (또는 EDI)에 있다고 가정합니다.
16 비트 주소의 경우 SI 및 DI 레지스터가 사용되며 32 비트 주소의 경우 ESI 및 EDI 레지스터가 사용됩니다.
다음 표는 다양한 버전의 문자열 명령어와 피연산자의 가정 된 공간을 제공합니다.
기본 지침 | 피연산자 | 바이트 연산 | 워드 연산 | 더블 워드 연산 |
---|---|---|---|---|
MOVS | ES : DI, DS : SI | MOVSB | MOVSW | MOVSD |
LODS | AX, DS : SI | LODSB | LODSW | LODSD |
STOS | ES : DI, AX | STOSB | STOSW | STOSD |
CMPS | DS : SI, ES : DI | CMPSB | CMPSW | CMPSD |
SCAS | ES : DI, AX | SCASB | SCASW | SCASD |
반복 접두사
REP 접두사를 문자열 명령어 앞에 설정하면 (예 : REP MOVSB) CX 레지스터에 배치 된 카운터를 기반으로 명령어가 반복됩니다. REP는 명령을 실행하고 CX를 1 씩 줄인 다음 CX가 0인지 확인합니다. CX가 0이 될 때까지 명령 처리를 반복합니다.
방향 플래그 (DF)는 작업의 방향을 결정합니다.
- CLD (Clear Direction Flag, DF = 0)를 사용하여 작업을 왼쪽에서 오른쪽으로 만듭니다.
- STD (Set Direction Flag, DF = 1)를 사용하여 작업을 오른쪽에서 왼쪽으로 만듭니다.
REP 접두어에는 다음과 같은 변형도 있습니다.
REP : 무조건적인 반복입니다. CX가 0이 될 때까지 작업을 반복합니다.
REPE 또는 REPZ : 조건부 반복입니다. 제로 플래그가 같음 / 제로를 나타내는 동안 작업을 반복합니다. ZF가 같지 않음 / 0이 아님을 나타내거나 CX가 0 일 때 중지됩니다.
REPNE 또는 REPNZ : 또한 조건부 반복입니다. 제로 플래그가 같지 않음 / 제로임을 나타내는 동안 작업을 반복합니다. ZF가 같음 / 0을 나타내거나 CX가 0으로 감소하면 중지됩니다.