조립-문자열

이전 예제에서 이미 가변 길이 문자열을 사용했습니다. 가변 길이 문자열은 필요한만큼의 문자를 가질 수 있습니다. 일반적으로 우리는 두 가지 방법 중 하나로 문자열의 길이를 지정합니다.

  • 문자열 길이를 명시 적으로 저장
  • 센티넬 캐릭터 사용

위치 카운터의 현재 값을 나타내는 $ 위치 카운터 기호를 사용하여 문자열 길이를 명시 적으로 저장할 수 있습니다. 다음 예에서-

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으로 감소하면 중지됩니다.