본문 바로가기
System Programming

[시스템 프로그래밍] 어셈블리어

by spareone 2025. 10. 21.

메모리


메모리는 코드와 데이터가 저장되는 공간
값들을 저장한 뒤 이 값을 가리킬 주소가 필요한데, 바이트 단위의 주소 부여


인텔 8086은 segment:offset 주소 결합으로 물리적 주소 지정


레지스터


CPU 내 위치하는 저장 공간


  1. 범용 레지스터

    • AX
      • AH, AL
      • 수학 연산, I/O 연산, INT21
    • BX
      • BH, BL
      • Base 또는 Pointer
    • CX
      • CH, CL
      • 루프 및 반복
    • DX
      • DH, DL
      • 다양한 데이터, 문자 출력
  2. 세그먼트 레지스터

    • CS: 코드를 저장하는 메모리 블록
    • DS: 데이터를 저장하는 메모리 블록
    • EX: 비디오 등의 처리를 위해 사용
    • SS: 루틴으로부터 return address를 저장하기 위해 프로세서에 의해 사용
  3. 인덱스 레지스터

    • SI: 문자열/배열 소스 지정
    • DI: 문자열/배열 목적지 지정
    • IP: 다음 명령의 주소 저장
  4. 스택 레지스터

    • BP: 스택 베이스 포인터
    • SP: 스택 포인터
  5. 특수목적 레지스터

    • IP: 다음에 실행될 명령어 주소 저장
    • Flag: 분기를 위해 사용 (1byte)

8086 어셈블리어


  1. MOV

    • 레지스터에 값 부여
    • MOV 목적지, 값
    • MOV AX, 56h -> AX에 56h 저장
    • MOX AX, BX -> AX에 BX 값 저장
  2. XCHG

    • 두 레지스터 값 변경
    • XCHG 레지스터1, 레지스터2
  3. INC, DEC

    • 데이터의 값을 1 증가(INC)하거나 1 감소(DEC)
    • INC DX
    • DEC DX
  4. PUSH, POP

    • 레지스터의 값을 stack에 넣거나(push) 가져옴(pop)
    • PUSH 레지스터
    • POP 레지스터
  5. 사칙연산

    • ADD (덧셈)
      • ADD 레지스터1, 레지스터2
      • ADD 레지스터, 값
    • SUB (뺄셈)
      • SUB 레지스터1, 레지스터2
      • SUB 레지스터, 값
    • MUL (곱셈)
      • MOV AX, 5h
      • MOX BX, 4Fh
      • MUL BX --> AX * BX 연산이 이루어져 AX에 저장됨
    • DIV (나눗셈)
      • MOV AX, 5h
      • MOV BX, 4Fh
      • DIV BX --> AX / BX 연산이 이루어져 AX에 저장됨
  6. 논리 연산

    • AND
      • AND 레지스터1, 레지스터2
      • AND 레지스터, 값
    • OR
      • OR 레지스터1, 레지스터2
      • OR 레지스터, 값
    • XOR
      • XOR 레지스터1, 레지스터2
      • XOR 레지스터, 값
    • NOT
      • NOT 레지스터

명령어 형식


  1. 지시어Directives
    • 기계어로 번역되지 않고 어셈블러에게만 명령 지시
  2. 명령어Instruction
    • 기계어로 번역되며 기계에 의해 실행
    • 종류
      • 연산항 0개
        • CLC (캐리 플래그 0으로 설정)
      • 연산항 1개
        • DEC CX (CX -= 1)
      • 연산항 2개
        • MOV AX, BX (BX의 값을 AX에 삽입)

데이터 정의


[레이블] [정의] 식[,반복]

정의에 들어가는 것

  1. DB: 바이트 정의
  2. DW: 워드 정의
  3. DD: 2워드 정의
  4. DQ: 4워드 정의
  5. DT: 10바이트 정의

분기와 표지


  1. 순차적 실행

    • 일반적으로 프로그램은 명령어가 저장된 순서로 실행
  2. 조건 분기

    • 명령어 분기: 명령어 실행 순서 변경
  3. 무조건 분기

    • JMP, CALL 등

주소 지정 방식


8086 어셈블러에서의 3가지 주소 지정 방식

  1. 값 즉시 지정
    • 연산항에 8비트 또는 16비트 숫자 값 지정
  2. 직접 주소 지정
    • 대상이 되는 레지스터나 메모리 번지를 그대로 연산항으로 사용
    • 종류
      • 레지스터 직접 주소 지정
      • 메모리 직접 주소 지정
  3. 간접 주소 지정
    • 2번째 항에서 명령어의 주소가 저장된 주소값을 지정 ([]로 레지스터 감싸기]
    • 종류
      • 레지스터 간접 주소 지정
      • 베이스 주소 지정
      • 인덱스 주소 지정
      • 베이스 인덱스 주소 지정

댓글