title: Set stack segment and offset in assembly
body: <p>I set up 4k stack space begins at end of the bootloader. After that, I read 16 sectors (=8k) of code to address 0x2000:0x0000. It's the kernel of my operating system. And I branched to it. </p>
  
  <p>The question is, how can I set up 8k stack space begins at end of the kernel?</p>
  
  <p><strong>bootloader.asm</strong></p>
  
  <pre><code>; bootloaders are always loaded to offset 0x7c00.
  ; so, define base to 7c00h.
    org 7c00h
  
  ; jmp to start function.
    jmp hg._start
  
  ; bootloader function.
  ; set stack and segment registers.
  hg._start:
    ; set stack space. (4K)
    mov ax, 07c0h
    add ax, 288 ; (4096+512)/16 bytes per paragraph.
                ; note that this bootloader loads
                ; remaining 8 sectors via int 13h:02.
    mov ss, ax
    mov sp, 4096
  
    mov ax, 07c0h
    mov ds, ax  ; set data segment to base of the
                ; bootloader. this can get rid of
                ; some memory access errors.
  
    ; from now on, we had set up segments.
    ; now we can get into real work, loading remaining
    ; 8 sectors with int 13h:02.
  
    ; load code to 0x2000:0x0000. (0x20000)
    mov bx, 2000h
    mov es, bx
    mov bx, 0
  
    mov ah, 02 ; int 13h:02 -&gt; bios read function.
    mov al, 16 ; read 8k of code.
    mov ch, 01 ; track to read.
    mov cl, 02 ; sector to read. (from 1 = mbr)
    mov dh, 01 ; head to read.
    mov dl, 80h; drive to read (0=fd0, 1=fd1, 80h=hd0, 81h=hd1)
    int 13h
  
    times 510-($-$$) db 0
    db 55h
    db 0aah
  </code></pre>