BoB/합격 후 활동
Intel x86 Insturction Set Architecture - 3
zooonique
2019. 11. 2. 03:40
반응형
[Jump and Loop]
JMP명령어는 label로 무조건적으로 점프한다.
LOOP명령어는 counting loop를 만든다.
- ECX ← ECX - 1
- if ECX != 0 , jump to target
ECX가 0이 될때까지 target을 반복한다.
어셈블러는 현재의 위치와 target label의 offset과의 거리를 바이트 단위로 계산한다.
이 계산한 값을 relative offset이라고 하고, 이 offset을 EIP에 더한다.
(loop 명령어 자체에 ecx - 1이 있구나!)
relative offest은 1바이트로 encode되는데, 뒤로는 -128, 앞으로는 +127까지 jump할 수 있다.
그게 왜?
명령의 평균 크기는 3바이트라서, loop는 평균적으로 42개의 명령어를 담을 수 있다.
[Nested Loop]
Loop안에 loop가 있을때, ecx가 겹치니까 카운트를 따로 저장해줘야 한다.
[Summing an Integer Array, Copying a String]
- 16bit 정수 배열의 합을 계산하는 코드일 경우, ecx에 배열의 길이를 넣으면 된다.
- source에서 target으로 문자열을 복사할 때, ecx에 source의 사이즈를 넣는다.
[TEST]
두 개의 오퍼랜드를 AND 연산하는데, 오퍼랜드는 변화없고 플래그들만 수정된다.
SF, ZF, PF 플래그가 수정되고 OF, CF 플래그는 0으로 설정된다. AF플래그는 정의되지 않는다.
[CMP]
- Syntax CMP destination, source
destination과 source를 비교하는 명령어다.
- destination == source , ZF set
- destination < source
- destination = 4, source = 5이면 CF set
- destination = -1, source = 5이면 SF != OF
- destination > source
- destination = 6, source = 5이면 ZF = 0, CF = 0
- destination = 5, source = -2이면 SF == OF
반응형