분기문
프로그램의 실행 흐름을 바꾸는 명령어
분기 명령어 사용시 명령어 포인터(Instruction Pointer)가 변경 됨.
분기문의 종류(ja, jae, jp, jpe, jb, jbe)는 매우 많지만 이름으로 직관적 유추 가능
모든 분기문은 다음과 같은 문법으로 동작
jmp/je/jz, …. label
jmp
특정 주소로 rip를 바꾸는 명령어. 아무 조건 필요x 무조건 지정된 주소로 점프하는 명령어
jmp foo ; foo로 이동
foo:
je (Jump if Equal) / jz (Jump if Zero)
- 직전에 비교한 두 피연산자가 같으면 점프 (Jump if equal)
ZF가 1이면 점프하는 명령어.
두 피연산자의 값이 같을 때 특정 동작을 수행하고 싶을 때 해당 명령어를 사용해 지정된 주소로 점프
ex. C언어 연산 ‘==’
je와 jz는 이름만 다를 뿐 기능 동일
mov rax, 10
mov rbx, 10
cmp rax, rbx ; (rax - rbx) = 0 -> ZF=1
je label ;ZF=1이면 label로 점프
jg (Jump if Greater) / jge (Jump if Greater or Equal)
- 직전에 비교한 두 연산자 중 전자가 더 크면 점프 (jump if greater)
- 직전에 비교한 두 연산자 중 전자가 더 크거나 서로 같으면 점프 (jump if greater or equal)
두 피연산자 중 어떤 값이 더 큰지 검사할 때 사용하는 분기문.
jg는 두 피연산자중 하나가 더 클때 점프(>)
jge는 두 피연산자중 하나가 더 크거나 같을때 점프(≥)
만약 두 피연산자 뺀 결과가 양수라면
왼쪽 피연산자가 더 크다고 할 수 있으므로 SF(Sign Flag)와 **ZF(Zero Flag)**가 비활성화
같다면 ZF가 활성화
따라서 jg 명령어가 실행되는 경우
SF == 0 && ZF == 0
jge 명령어가 실행되는 경우
SF == 0 && (ZF == 1 || ZF ==0)
SF가 비활성화 상태인지가 해당 명령어를 수행할 때 중요한 조건
mov eax, 5
mov ebx, 2
cmp eax, ebx ;(5-2) = 3 > 0 -> ZF=0, SF=0
jg label1 ; 크면 점프
jge label2 ;크거나 같으면 점프
jl (Jump if Less) / jle (Jump if Less or Equal)
- 직전에 비교한 두 연산자 중 전자가 더 작으면 점프 (jump if less)
- 직전에 비교한 두 연산자 중 전자가 더 작거나 서로 같으면 점프 (jump if less or equal)
두 피연산자 중 어떤 값이 더 작을 때 특정 동작 수행하고 싶을때 해당 명령어 사용
jg / jge 명령어와 부호가 반대로 동작
두 피연산자를 뺀 결과가 음수면, 왼쪽 피연산자가 더 작다고 할 수 있으므로 SF(Sign Flag)가 활성화
같다면 ZF(Zero Flag)가 활성화 되므로
jl 명령어가 실행되는 경우는
SF == 1 && ZF == 0
jle 명령어가 실행되는 경우
SF ==1 && (ZF == 0 || ZF == 1)
mov eax, -10
mov ebx, 0
cmp eax, ebx ; (-10-0)=-10 < 0 -> SF=1, ZF=0
jl label1 ;작으면 점프
jle label2 ;작거나 같으면 점프
jne (Jump if Not Equal) / jnz (Jump if Not Zero)
- 직전에 비교한 두 피연산자가 다르면 점프 (jump if not equal)
두 피연산자가 서로 다를때 지정된 주소로 점프
ex. C언어 ‘≠’
jne과 jnz는 이름만 다를 뿐 동일 기능 수행
cmp rax, rbx ; rax - rbx ≠ 0 ⇒ ZF = 0
jnz label ; rax != rbx 이면 점프
반복문
반복문은 특정 조건이 만족될 때까지 주어진 동작 반복해서 수행
ex. C언어 ‘for / while / do-while

이를 어셈블리어 코드로 작성

어셈블리어 반복문 1 - 카운터 기반 반복문 (ex. C언어 - for문)
--> 일정 횟수만큼 반복하는 형태
mov rcx, 10 ;반복 횟수 설정
loop_start:
;반복할 코드
loop loop_start ; RCX를 감소시키며 0이 아닐때까지 반복
어셈블리어 반복문 2 - 조건 기반 반복문 (ex. C언어 - while문)
--> 특정 조건을 만족할 때 까지 실행하는 반복문
check_condition:
cmp rax, 50 ; 특정 조건 확인
jge loop_exit ; 조건이 마
어셈블리어 반복문 3 - 후조건 검사 반복문 (ex. C언어 - do-while문)
--> 최소 한 번 실행된 후 조건을 검사
do_loop:
; 반복할 코드 실행
cmp rax, 10 ; 조건검사
jl do_loop ;조건이 만족하면 다시 실행반복문에서 주의할 점
'Computer Science > language' 카테고리의 다른 글
| [assembly] Assembly 함수, 시스템 콜 정리 (0) | 2025.05.25 |
|---|---|
| [language] 객체지향 언어와 클래스의 개념 (2) | 2025.05.24 |
| [assembly] Assembly 기본 문법 (0) | 2025.05.24 |
| [python] pycryptodome 모듈을 활용 한 AES 알고리즘 구현 (0) | 2025.05.24 |
| [assembly] x86 Assembly? (0) | 2025.05.24 |