[英]Set stack segment and offset in assembly
我设置4k堆栈空间是从引导加载程序的末尾开始的。 之后,我读取了16个扇区(= 8k)的代码,地址为0x2000:0x0000。 这是我的操作系统的内核。 我分支到它。
问题是,如何设置从内核末尾开始的8k堆栈空间?
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
尝试
mov ax,2000h
mov ss,ax
mov sp,4000h
这应该将堆栈设置为您想要的位置。 通常不需要其他设置。
请注意,您不需要为此禁用中断,因为x86 CPU在将新的段选择器加载到ss
后隐式禁用了一条指令的中断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.