카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/09

asm 이동, 호출, 비교

1. Flags

    • 플래그는 레지스터와 마찬가지로 데이터를 보유한다.
    • 플래그는 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 스택의 맨 아래를 가리킴
...
3. Control Flow
    • 모든 코드는 기본적으로 위에서 아래로 실행된다. 프로그램이 흐르는 방향을 제어 흐름이라고 한다.
    • 추출 레지스터 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
    • 아래 코드 rax 레지스터의 값이 23인 경우에만 “_doThis” 레이블의 주소로 이동하다.
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” 자체 섹션으로 이동 후 해당 섹션이 호출 된다.
    • 이를 서부 루틴 이라 한다.

댓글 없음:

댓글 쓰기