어셈블리 제어문 [크래프톤 정글 19일차] 요약
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- *소프트웨어 개발자, 저수준 프로그래밍 학습자**
- 난이도: 중급 (어셈블리 언어 기초 지식 필요)
핵심 요약
- 조건코드(ZF, SF, OF, CF)는 연산 결과를 기반으로 플래그 레지스터에 저장되어 조건 실행을 결정함
- CMP는 값 비교, TEST는 비트 마스크 검사를 위한 명령어로, 연산 결과는 저장되지 않음
- SET, JMP, CMOVE 명령어는 조건코드를 활용해 조건부 실행/데이터 이동을 구현함
섹션별 세부 요약
1. 조건코드 이해
- ZF(Zero Flag): 연산 결과가 0인지 판단
- SF(Sign Flag): 결과가 음수인지 판단
- OF(Overflow Flag): 2의 보수 표현 오버플로우 여부 확인
- CF(Carry Flag): 비부호형 오버플로우 여부 확인
- ADD, SUB, CMP 등 연산 명령어 실행 시 플래그 레지스터에 저장됨
2. CMP와 TEST 명령어 비교
- CMP:
a - b
연산 후 플래그 설정 (크기 비교에 주로 사용) - TEST:
a & b
연산 후 플래그 설정 (값 0 여부 또는 비트 마스크 검사) - 예시:
cmp %rax, %rbx
→rbx - rax
비교,test %rax, %rax
→%rax == 0
검사
3. 조건코드 활용 예제
- SET 명령어: 조건에 따라 0 또는 1을 레지스터에 저장
- 예: sete %cl
→ ZF == 1일 때 cl = 1
- JMP 명령어: 조건에 따라 프로그램 흐름 제어
- 예: jl less_label
→ rax < rbx
일 때 less_label
로 이동
- CMOVE 명령어: 조건 충족 시 데이터 이동
- 예: cmove %rdx, %rax
→ ZF == 1일 때 rax = rdx
4. 조건부 접미사 의미
- e/z: ZF == 1 (값이 같을 때)
- g/ge: SF == OF 조건 (signed 비교)
- a/ae: CF == 0 조건 (unsigned 비교)
- s/ns: SF == 1 또는 0 (결과의 부호 판단)
5. 실사용 예제
cmp %rbx, %rax
→ ZF == 1일 때sete %cl
로cl = 1
test %rdi, %rdi
→rdi == 0
일 때cmove %rdx, %rax
로rax = 0
- 예제 결과: 두 값이 같으면 1, 다르면 0 반환
결론
- 조건코드와 CMP, TEST 명령어를 통해 조건부 실행을 구현하고, SET, JMP, CMOVE를 활용해 효율적인 어셈블리 코드를 작성할 수 있음
- 플래그 레지스터를 이해하고, 조건부 접미사의 조합을 활용해 복잡한 논리 처리 가능
- 실무 예제에서
cmp
,test
,cmove
사용법을 직접 적용해보며 익히기 권장