相关疑难解决方法(0)

引导加载程序不会跳转到内核代码

我正在编写小型操作系统 - 用于练习.我从bootloader开始.
我想创建一个以16位实模式运行的小命令系统(现在).
我创建了重置驱动器的bootloader,然后在bootloader之后加载扇区.
问题是因为jmp功能后没有任何实际发生.

我不想尝试在0x7E00加载下一个扇区(我不完全确定如何使用es:bx指向地址,这可能是一个问题,我相信它的地址:偏移),就在引导加载程序之后.

这是代码:

;
; SECTOR 0x0
;

;dl is number of harddrive where is bootloader
org 0x7C00
bits 16

;reset hard drive
xor ah,ah
int 0x13
;read sectors
clc
mov bx,0x7E00
mov es,bx
xor bx,bx
mov ah,0x02 ;function
mov al,0x1  ;sectors to read
mov ch,0x0  ;tracks
mov cl,0x1  ;sector
mov dh,0x0  ;head
int 0x13
;if not readed jmp to error
jc error
;jump to 0x7E00 - executed only if loaded
jmp 0x7E00 …
Run Code Online (Sandbox Code Playgroud)

assembly virtualbox nasm bootloader x86-16

15
推荐指数
1
解决办法
4475
查看次数

近呼叫/跳转表并不总是在引导加载程序中工作

一般问题

我一直在开发一个简单的引导加载程序,并且在某些环境中偶然发现问题,这些环境中的指令不起作用:

mov si, call_tbl      ; SI=Call table pointer
call [call_tbl]       ; Call print_char using near indirect absolute call
                      ; via memory operand
call [ds:call_tbl]    ; Call print_char using near indirect absolute call
                      ; via memory operand w/segment override
call near [si]        ; Call print_char using near indirect absolute call
                      ; via register
Run Code Online (Sandbox Code Playgroud)

这些中的每一个碰巧涉及间接接近CALL到绝对存储器偏移.我发现如果我使用类似的JMP表,我会遇到问题.相对的呼叫和跳转似乎没有受到影响.像这样的代码有效:

call print_char 
Run Code Online (Sandbox Code Playgroud)

我已经通过海报讨论了Stackoverflow上提出的建议,讨论了编写引导加载程序的注意事项.特别是我看到这个Stackoverflow回答了一般的Bootloader技巧.第一个提示是:

  1. 当BIOS跳转到您的代码时,您不能依赖具有有效或预期值的CS,DS,ES,SS,SP寄存器.应在引导加载程序启动时正确设置它们.您只能保证将从物理地址0x07c00加载并运行引导加载程序,并将引导驱动器号加载到DL寄存器中. …

x86 assembly real-mode nasm bootloader

7
推荐指数
1
解决办法
584
查看次数

加载引导加载程序的第二阶段

我正在尝试为x86机器创建一个小型操作系统,并开始为相当小的引导程序编写代码.我创建的引导加载程序非常简单,它从主引导记录之后的扇区加载一个小的第二个引导加载程序并跳转到该代码.主引导记录中的引导加载程序代码似乎运行正常,当它尝试跳转到第二阶段引导加载程序时会出现问题.这个第二阶段的引导加载程序应该输出一个表示成功的字母(字母S),这样我就能告诉代码正在执行.问题是屏幕上没有出现任何问题,所以我怀疑第二阶段的引导程序从未执行过.我使用的代码如下:

主引导记录中的Bootloader:

[BITS 16] ; 16 bit mode
[ORG 0x7C00] ; Boot loader start address

Boot:
    ; Initial, dl contains drive number
    ; Set data segment to code segment
    mov ax, cs
    mov ds, ax
    mov es, ax
    ; Set the stack segment to 0xA000
    add ax, 0xA000
    mov ss, ax
    mov sp, 0x00
    ; Reset the drive, dl contains drive number
    mov ah, 0x00
    int 0x13
    ; Read from drive, dl contains drive number
    ;     Set up output location …
Run Code Online (Sandbox Code Playgroud)

x86 assembly real-mode nasm bootloader

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

标签 统计

assembly ×3

bootloader ×3

nasm ×3

real-mode ×2

x86 ×2

virtualbox ×1

x86-16 ×1