OS/Multi-threaded Kernel from Scratch

[Multi-threaded Kernel] 0. Basic Assembly

jschang 2021. 7. 29. 18:03

서론

이번 강의에서 Kernel 개발을 위해 필요한 Assembly 문법을 배워보겠습니다.


이론

Register

  • ax
    • ah (High Byte)
    • al (Low Byte)
  • ip: 현재 진행되고 있는 instruction의 주소 가리킴
  • sp: Stack 포인터
  • ds: Data Segment
    • Assembly에서 메모리 주소에 접근할 때 Data Segment 고려
    • 절대 주소 계산: (ds값)*16+offset
    • 메모리 주소가 매우 크기 때문에 하나의 레지스터로 표현 못하기 때문
  • ss: Stack Segment
  • cs: Code Segment

org 100h

작성한 프로그램이 해당 메모리 주소(100h; h: 16진수)에 불러오게 하여 offset 설정

int 10h

10h Interrupt 호출; 10h: 화면에 출력하는 Bios Routine

lodsb

SI 레지스터가 가리키는 곳을 al 레지스터에 저장

jmp $

현재 주소로 jump; 무한 루프

push 0xffff

Stack에 0xffff push

pop ax

Stack에서 pop해 ax 레지스터에 저장

Little Endian

인텔 아키텍처에서 0x0103을 메모리에 저장 시, 03 01로 저장


예제

문자 출력

mov ah, 0eh
mov al, 'A'
int 10h

Data Segment 값 변경

mov ax, 0x30
mov ds, ax
mov [0xff], 0x30

이때 0x30이 저장된 메모리의 주소는 (0x30*16)+0xff 입니다.

Hello World 출력

org 100h

jmp _print

_message: db 'Hello', 0
_print:
    mov ah, 0eh
    mov si, _message
    _loop:
        lodsb
        int 0x10  
        cmp al, 0
        je _done
        jmp _loop
    ret
    
_done:
    ret