• 플래그는 레지스터와 마찬가지로 데이터를 보유한다.
• 플래그는 1 비트 씩만 보유한다. false 또는 True
• 개별 플래그는 더 큰 레지스터의 일부임.
Flag Symbol | Description |
CF | Carry |
PF | Parity |
ZF | Zero |
SF | Sign |
OF | Overflow |
AF | Adjust |
IF | Interrupt Enabled |
2. Pointers
• 포인터 레지스터 또한 데이터를 보유한다.
• 포인터가 데이터를 가리키면, 메모리 주소를 보유한다는 것을 의미한다.
Pointer Name | Meaning | Description |
rip (eip, ip) | Index pointer | 제어 흐름에서 실행될 다음 주소를 가리킴. |
Rrsp (esp, sp) | Stack pointer | 스택의 최상위 주소 가리킴 |
Rrbp (ebp, bp) | Stack base pointer | 스택의 맨 아래를 가리킴 |
…
|
…
|
...
|
• 모든 코드는 기본적으로 위에서 아래로 실행된다. 프로그램이 흐르는 방향을 제어 흐름이라고 한다.
• 추출 레지스터 rip는 실행될 다음 명령어의 주소를 보유한다. 각 명령 후, 제어 흐름이 위에서 자연스럽게 흐르도록 1 씩 증가한다.
4. Jump
• jump를 사용하면 레이블 기반으로 다른 코드 부분으로 이동할 수 있다.
• jump는 프로그램 흐름을 전환하는데 사용한다.
• jmp lable <- rip 레지스터에 "label" 값으로 로드한다.
5. Comparisons
• 비교를 통해 프로그램을 특정 조건에 따라 다른 경로를 취할 수 있다.
• 비교는 레지스터에서 수행.
• 비교 일반적 형식
cmp register, register/value
cmp rax, 23
cmp rax, rbx
5.1 Comparisons with Flags
• 비교가 이루어지면 특정 플래그가 설정된다.
cmp
a, b
|
|
a=b
|
ZF
= 1
|
A
!= b
|
ZF
= 0
|
-
|
SF
= msb(a-b
|
...
|
...
|
5.2 Conditional Jumps
• 비교가 이루어지면 조건부 점프를 할 수 있다.
• 코드의 조건부 점프는 jump 작성 되며, jmp로 대체할 수 있다.
Jump
symbol(signed)
|
Jump
symbol(unsigned)
|
Results
of cmp a,b
|
je
|
-
|
a
= b
|
jne
|
-
|
a
!= b
|
jg
|
ja
|
a
> b
|
jge
|
jae
|
a
>= b
|
ji
|
jb
|
a
< b
|
jle
|
jbe
|
a
<= b
|
jz
|
-
|
a
= 0
|
jnz
|
-
|
a
!= 0
|
jo
|
-
|
Overflow
occurred
|
jno
|
-
|
Overflow
did not occur
|
js
|
-
|
jump
if signed
|
jns
|
-
|
jump
if not signed
|
cmp rax, 23
je _doThis
• 아래 코드 rax 레지스터의 값이 rbx 레지스트의 값보다 큰 경우에만 레이블 “_doThis”의 주소로 이동한다.
cmp rax, rbx
jg _doThis
6. Registers as Pointers
기본 레지스터는 포인터로 처리 될 수 있다.
레지스터를 포인터로 처리하려면 “rax”가 “[rax]” 되도록 레지스터 이름을 대괄호로 묶는다.
mov rax, rbx
rbx 레지스터의 값을 rax 레지스터에 로드한다.
mov rax, rbx
rbx 레지스터의 값을 rax 레지스터에 로드한다.
mov rax, [rbx]
rbx 레지스터가 가리키는 값을 rax 레지스터에 로드한다.
7. Calls
• 호출은 점프와 본질적 동일한 모양을 가진다.
• “call”을 사용하면 호출이 이루어진 원래 위치는 “ret”를 사용해 반환한다.
• print 코드 부분 “Hello, World” 자체 섹션으로 이동 후 해당 섹션이 호출 된다.
• 이를 서부 루틴 이라 한다.
댓글 없음:
댓글 쓰기