외로운 Nova의 작업실

Assembly 언어 공부 - 31(스트링 프리미티브 명령어) 본문

Programming/Assembly

Assembly 언어 공부 - 31(스트링 프리미티브 명령어)

Nova_ 2022. 10. 10. 11:18

안녕하세요, 이번 시간에는 irvine32 라이브러리중에 문자열을 손쉽게 다룰 수 있게 해주는 스트링 프리미티브 명령어에대해서 알아보겠습니다.

 

- 스트링 프리미티브 명령어

MOVSB, MOVSW, MOVSD : 데이터를 ESI가 가르키는 메모리에서 EDI가 가르키는 메모리로 복사한다.

CMPSB, CMPSW, CMPSD : ESI와 EDI가 가르키는 두 메모리의 내용을 비교한다.

SCASB, SCASW, SCASD : 누산기(AL,AX,EAX)의 값과 와 EDI가 가르키는 메모리의 내용을 비교합니다.

STOSB, STOSW, STOSD : 누산기의 내용을 EDI가 가르키는 메모리에 저장합니다.

LODSB, LODSW, LODSD : ESI가 가르키는 내용을 누산기로 적재합니다.

 

위 명령어들은 배열을 다루다보니 Repeat 접두사로 그 배열을 모두 탐색 및 처리할 수 있게 도와줍니다.

REP : ECX > 0 인 동안 반복합니다.

REPZ, REPE : zero 플래그가 1이고  ECX > 0 인동안 반복합니다 - 같을때 까지 반복합니다.

REPNZ, REPNE : zero 플래그가 0이고 ECX > 0 인동안 반복합니다 - 다를때 까지 반복합니다.

바로 간단한 예제를 보겠습니다. 

.code
cld
mov esi, OFFSET string1
mov edi, OFFSET string2
mov ecx, 10
rep movsb

위 코드는 인덱스 지정을 인덱스 지정을 하지않더라도 esi의 배열이 edi로 복사됩니다. 총 10번말이죠.

 

- 방향플래그

인덱스 값을 증가시키면서 반복할 수도 있고, 인덱스값을 감소시키면서 반복할 수 있습니다. 이는 아래 두가지 명령어에의해 결정됩니다.

CLS : 인덱스값을 증가(낮은주소 -> 높은주소)시키면서 반복하게합니다.

STD : 인덱스값을 감소(높은주소 -> 낮은주소)시키면서 반복하게합니다.

 

- MOVSB, MOVSW, MOVSD

예제를 한번 보겠습니다.

.data
source DWORD 20 DUP(0FFFFFFFFh)
target DWORD 20 DUP(?)
.code
cld
mov ecx, LENGTHOF source
mov esi, OFFSET source
mov edi, OFFSET target
rep movsd

위 코드는 target 배열을 0FFFFFFFF 값으로 모두 초기화를 시켜줍니다. Loop문을 직접 사용하지않게되어 편리합니다.

 

- CMPSB, CMPSW, CMPSD

예제를 한번 보겠습니다.

.data
source DOWRD 1234h
target DWORD 5678h
.code
mov esi, OFFSET source
mov edi, OFFSET target
cmpsd
ja L1

위 코드는 1234h와 5678h를 비교합니다. source 값이 더 작기때문에 L1으로 분기되지는 않습니다.

 

- SCASB, SCASW, SCASD

예제를 한번 보겠습니다.

.data 
string BYTE "ABCDEFGHIJK", 0
.code
mov edi, OFFSET string
mov al, 'H'
mov ecx, LENGTHOF stirng
cld
repne scasb
jnz quit

위 코드는 string에서 H 문자를 찾게되고, 만약 찾지못한다면 quit 으로 종료하게되는 코드입니다.

 

- STOSB, STOSW, STOSD

예제를 한번 보겠습니다.

.data 
count = 12
string BYTE count DUP(?)
.code
mov al,0FFh
mov edi, OFFSET string
mov ecx, count
cld
rep stosb

위 코드의 실행 결과는 string 배열에 0FF로 초기화가 됩니다.

 

- LODSB, LODSW, LODSD

LODSB 명령어는 아래 코드로 어셈블됩니다.

mov al, [esi]
inc esi

 

Comments