简体   繁体   中英

Set stack segment and offset in assembly

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.

The question is, how can I set up 8k stack space begins at end of the kernel?

bootloader.asm

; 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 -> 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

Try

mov ax,2000h
mov ss,ax
mov sp,4000h

This should set the stack to where you want it to be. There is no other setup needed in general.

Note that you do not need to disable interrupts for this to work as the x86 CPU implicitly disables interrupts for one instruction after loading a new segment selector into ss .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM