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개의 명령어를 담을 수 있다.

 

4,294,967,296 = 0x1 0000 0000

[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를 비교하는 명령어다.

  1. destination == source , ZF set
  2. destination < source 
    • destination = 4, source = 5이면 CF set
    • destination = -1, source = 5이면 SF != OF
  3. destination > source 
    • destination = 6, source = 5이면 ZF = 0, CF = 0
    • destination = 5, source = -2이면 SF == OF

 

반응형