외로운 Nova의 작업실
Assembly 언어 공부 - 31(스트링 프리미티브 명령어) 본문
안녕하세요, 이번 시간에는 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
'Programming > Assembly' 카테고리의 다른 글
Assembly 언어 공부 - 34(구조체) (0) | 2022.10.29 |
---|---|
Assembly 언어 공부 - 33(전치 암호화 구현) (0) | 2022.10.29 |
Assembly 언어 공부 - 30(INVOKE,ADDR,PROC,PROTO 디렉티브) (0) | 2022.10.03 |
Assembly 언어 공부 - 29(ENTER과 LEAVE 명령어, LOCAL 명령어) (0) | 2022.10.02 |
Assembly 언어 공부 - 28(간접 주소 지정 이론2 - rea 명령어) (0) | 2022.10.02 |