어셈블리어 데이터 이동, 산술, 분기

두부4등분·2025년 10월 12일

데이터 이동 산술 분기에 맞춰서 어셈블리어 문법 다시 작성할 예정

어셈블리어 기본 문법

mov add sub cmp jmp

mov

mov는 두 번째 피연산자의 값을 첫 번째 피연산자로 복사하는 명령어다.
mov eax,ebx = "ebx의 값을 eax로 복사한다."

add

add는 첫 번째 피연산자에 두번째 피연산자의 값을 더한 결과를 저장하는 명령어다.
add eax, ebx = "eax에 ebx를 더한 값을 eax에 저장한다." (+=)

  • 플래그 변화 (연산 결과에 따라 플래그 값이 변경된다. 추후 플래그에 대해서 더 알아보도록 하겠다.)
    ZF (Zero Flag): 결과가 0이면 1
    CF (Carry Flag): overflow 발생 시 1
    SF (Sign Flag): 결과가 음수이면 1

sub

sub는 첫 번째 피연산자에서 두 번째 피연산자의 값을 결과를 저장하는 명령어다.
sub eax, ebx = “eax에서 ebx를 뺀 값을 eax에 저장한다.” (-=)

  • 플래그 변화
    ZF: 결과가 0이면 1
    CF: Borrow 발생 시 1
    SF: 결과가 음수이면 1

cmp

cmp는 두 피연산자의 값을 비교하는 명령어다.
내부적으로는 sub와 동일하게 뺄셈을 수행하지만, 결과를 저장하지 않고 플래그만 변경한다.
cmp eax, ebx = "eax와 ebx를 비교한다." (eax-ebx 수행 후 결과 버림)

  • 플래그 변화
    ZF: 두 값이 같으면 1 (eax == ebx)
    CF: Borrow 발생 시 1 (eax < ebx)
    SF: 결과가 음수면 1 (eax < ebx)

jmp

jmp는 프로그램의 실행 흐름을 다른 위치로 이동 시키는 명령어다.
-> 다음에 실행할 명령어의 주소(label)를 바꿔서 코드의 흐름을 제어
jmp label = "label 위치로 이동하여 그곳부터 실행을 계속한다."

  • jmp 기본 구조
section .text
global _start
; -----------------
_start:
    jmp skip_part
; --(실행되지 않음)--
    mov eax, 1
    mov ebx, 2
; -----------------
skip_part:
    mov eax, 10
    mov ebx, 20

Register

레지스터는 CPU 내부에 위치한 임시저장공간이다.

레지스터는 다양한 종류가 있지만 여기서는 범용 레지스터플래그 레지스터만 다루겠다.


범용레지스터 (General Purpose Register, GPR)

x86(32비트)에는 EAX, EBX, ECX, EDX, EDI, ESI, ESP, EBP 총 8가지 범용 레지스터가 있다.

산술 연산, 반복문, 스택 관리, 메모리 접근 등 거의 모든 연산의 중심이 된다.

레지스터이름(의미)주요 역할
EAXAccumulator연산 결과나 함수 리턴값 저장
EBXBase메모리 주소 계산에 사용
ECXCounter루프나 반복문 제어에 사용
EDXData곱셈·나눗셈 시 보조 역할
ESISource Index문자열/배열 복사 시 입력 위치
EDIDestination Index문자열/배열 복사 시 출력 위치
EBPBase Pointer스택 프레임 기준 주소 (함수 내부 변수 참조)
ESPStack Pointer스택의 최상단(Top)을 가리킴

💡 참고: 64비트(x86-64) 환경에서는 EAX → RAX, EBX → RBX처럼
R 접두사가 붙으며, R8 ~ R15까지 추가 레지스터가 존재한다.


플래그 레지스터 (Flag Register)

플래그 레지스터는 CPU가 연산을 수행한 후
그 결과의 상태를 기록하는 상태 저장 레지스터이다.
조건문(cmp, je, jne, jg, jl 등)은 이 플래그 값을 참조하여 분기 여부를 결정한다.

플래그의미역할
ZF (Zero Flag)0 플래그연산 결과가 0이면 1로 설정
SF (Sign Flag)부호 플래그결과가 음수이면 1로 설정
CF (Carry Flag)캐리 플래그자리올림(또는 자리내림) 발생 시 1
OF (Overflow Flag)오버플로 플래그부호 있는 연산에서 오버플로 발생 시 1
PF (Parity Flag)패리티 플래그결과의 1 비트 개수가 짝수면 1

💡 예시:

cmp eax, ebx    ; EAX와 EBX 비교 → EFLAGS 설정
je equal_label  ; ZF=1이면(equal) 점프 수행

추가로 조사할 점

  • ALU는 무엇인가
  • CPU 내부 동작 방식 (세부적으로)
  • 16비트 32비트 64비트 간의 차이점
  • 자리올림/내림은 어떻게 이루어지는가

0개의 댓글