小编WOR*_*559的帖子

如何在i386中正确设置ss和sp寄存器

我目前正在编写一个bootloader并且已经开始耗尽我的512B空间,所以我开始在512B之外编写更多代码并打算使用bootloader将其读入内存.我添加到我的代码的末尾:

stack_start:
    resb 4096
stack_end:
Run Code Online (Sandbox Code Playgroud)

这样我就可以在操作系统代码的末尾为堆栈分配空间.目前在我的引导程序中,我在引导加载程序之后为堆栈分配4KiB,使用以下我从这里获取:

mov ax, 07c0h           ; 4K stack space after the bootloader -- code is running at 0x07c0
add ax, 288             ; (4096 + 512)/16 bytes per paragraph (288 paragraphs)
mov ss, ax
mov sp, 4096            ; moves the stack pointer
Run Code Online (Sandbox Code Playgroud)

但是现在我需要一种方法来将堆栈分配到我的操作系统代码的末尾,这将是一个未知的大小.

我相信我理解这些是如何建立的 - 类似于使用es,我ss用于扩展寻址空间,但我找不到任何能够很好地解释我的知识水平的东西.我也不确定如何正确设置它以使我的堆栈结束.我用过:

mov ax, stack_start
mov ss, ax
mov sp, 4096
Run Code Online (Sandbox Code Playgroud)

并没有遇到过错误; 但是我想知道这是否正确,或者我是否真的只为堆栈分配了一些空间,同时用更高的地址填充内存.

ss实际上如何运作?我如何使用它并sp在代码末尾为堆栈分配内存?

这是在使用nasm的i386中.

编辑:如果可能的话,某些方法来验证堆栈是否在正确的位置也非常有用.

assembly operating-system nasm bootloader i386

5
推荐指数
1
解决办法
729
查看次数

为什么我的根目录没有被加载?(FAT12)

我在程序集中编写了一个stage 1 bootloader,我试图将FAT12文件系统加载到内存中,以便我可以加载我的stage 2 bootloader.我已经设法将FAT加载到内存中,但是我很难将根目录加载到内存中.

我目前正在使用作为参考,并产生了以下内容:

.load_root:
    ;es is 0x7c0
    xor dx, dx              ; blank dx for division
    mov si, fat_loaded      ; inform user that FAT is loaded
    call print
    mov al, [FATcount]      ; calculate how many sectors into the disk must be loaded
    mul word [SectorsPerFAT]
    add al, [ReservedSectors]
    div byte [SectorsPerTrack]
    mov ch, ah              ; Store quotient in ch for cylinder number
    mov cl, al              ; Store remainder in cl for sector number

    xor dx, dx …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm bootloader fat

5
推荐指数
2
解决办法
353
查看次数

标签 统计

assembly ×2

bootloader ×2

nasm ×2

fat ×1

i386 ×1

operating-system ×1

x86 ×1