ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Multi-threaded Kernel] 0. Basic Assembly
    OS/Multi-threaded Kernel from Scratch 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
Designed by Tistory.