-
[OS] 04. Boot Sector StackOS/OS from Scratch 2021. 6. 20. 15:32
서론
이번 강의에서는 가장 기본적인 Boot Sector에서 Stack을 만들어 보겠습니다. 해당 Github 강의는 다음과 같습니다.
https://github.com/cfenollosa/os-tutorial/tree/master/04-bootsector-stack
cfenollosa/os-tutorial
How to create an OS from scratch. Contribute to cfenollosa/os-tutorial development by creating an account on GitHub.
github.com
이론
Assembly Stack
bp레지스터는 Stack의 Bottom을 의미하며, sp레지스터는 stack의 top을 의미합니다. 이때 Stack은 bp에서 시작해 아래로 sp까지 자라나는 구조이며, Stack에 원소를 넣을수록 sp가 줄어듭니다. Stack의 원소는 push, pop을 이용해 넣고 빼며, words, doublewords 크기의 데이터만 가능합니다.
코드
Stack의 오버플로우를 막기위해 Stack의 시작점을 Boot Sector에서 멀리 떨어진 0x8000으로 설정했습니다. Stack에 push 하는 값은 2byte 크기이므로 첫 번째 원소의 위치는 bp-2 지점, 두 번째 원소는 bp-4 위치로 2 단위씩 데이터가 저장돼있습니다.
mov ah, 0x0e ; 오버플로우 방지위해 멀리 떨어진 지점으로 mov bp, 0x8000 mov sp, bp push 'A' push 'B' push 'C' mov al, [bp-2] int 0x10 mov al, [bp-4] int 0x10 mov al, [bp-6] int 0x10 pop bx mov al, bl int 0x10 pop bx mov al, bl int 0x10 pop bx mov al, bl int 0x10 jmp $ times 510-($-$$) db 0 dw 0xaa55
실행 결과
위 코드를 실행 bin파일로 컴파일하고, qemu로 실행시키면 다음과 같은 화면이 나옵니다. Stack에 차례로 A, B, C를 넣고 위에서부터 C, B, A를 pop하므로 출력되는 값은 ABCCBA입니다.
실행 모습 'OS > OS from Scratch' 카테고리의 다른 글
[OS] 06. Boot Sector Segmentation (0) 2021.06.20 [OS] 05. Boot Sector Function (0) 2021.06.20 [OS] 03. Boot Sector Memory (0) 2021.06.20 [OS] 02. Boot Sector Print (0) 2021.06.20 [OS] 01. Boot Sector Barebone (0) 2021.06.20