小编vak*_*kus的帖子

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

我正在编写小型操作系统 - 用于练习.我从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
查看次数

如何从实模式写入带有视频内存地址0xb8000的屏幕?

我创建了简单的代码来从硬盘驱动器加载第二个扇区,然后写入整个屏幕,空格为红色背景.问题是我总是用@符号代替空格.这是代码:

org 0x7C00
bits 16

xor ax,ax
mov ds,ax
mov es,ax

mov bx,0x8000
cli
mov ss,bx
mov sp,ax
sti

cld
clc

xor ah,ah
int 0x13
mov bx,0x07E0
mov es,bx
xor bx,bx
mov ah,0x2 ;function
mov al,0x5 ;sectors to read
mov ch,0x0 ;track
mov cl,0x2 ;sector
mov dh,0x0 ;head
int 0x13
;jc error
;mov ah, [0x7E00]
;cmp ah,0x0
;je error
jmp error
cli
hlt
jmp 0x07E0:0x0000

error:
    xor bx,bx
    mov ax,0xb800
    mov es,ax
    mov al,0x40 ;colour
    mov ah,' ' ;character
    .red: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly real-mode nasm bare-metal

8
推荐指数
1
解决办法
5624
查看次数

在引导扇区中使用 INT 0x10 打印字符串

我想创建printl允许我在寄存器中打印字符串的函数ax。我处于 16 位实模式,找不到任何打印消息的方法。我用来int 0x10打印一封信。

我尝试在寄存器中传递参数(要打印的字符串)bx,然后在循环中逐个字母地打印,然后使用popaand返回ret。我的代码并没有真正起作用——要么它创建了一个无限循环,要么打印了一个奇怪的符号。

如果您知道更有效的方法,那么这不是问题。如果您提供任何评论,我还想询问您的代码

这是我的代码

启动.asm:

start:
    mov bx, welcome    ;put argument to bx
    call printl        ;call printl function in sysf.asm
    hlt                ;halt cpu

welcome db 'Hello', 0

include 'sysf.asm'
times 510 - ($-$$) db 0

db 0x55
db 0xAA
Run Code Online (Sandbox Code Playgroud)

sysf.asm:

;print function
; al is one letter argument (type Java:char)
;
print:
        pusha
        mov ah, 0x0e
        int 0x10
        popa
        ret              ; go back

;printl function …
Run Code Online (Sandbox Code Playgroud)

x86 assembly fasm

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

哪些指令不能在特定CPU环下发出

根据这个来源(级别3 - 5),特定的CPU环不能做某些事情,例如环1、2、3代码不能设置GDT,因为操作系统内核会崩溃。

虽然很明显Ring 0可以执行所有指令,我想知道哪些指令不能在Ring 1、2和3中发出?

我在维基百科或 osdev 以及类似的来源上找不到任何内容来说明哪些指令不能在特定环中发出。

cpu x86

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

在实模式下访问4GB RAM

是否可以通过启用A20在实模式下使用4GB内存,而无需切换到保护模式,也不会丢失BIOS中断?

x86 assembly real-mode

2
推荐指数
1
解决办法
459
查看次数

BIOS 键盘缓冲区

我决定用汇编和裸机做一些有趣的事情,以提高我的操作系统开发编程技能。所以我决定制作类似于“太空入侵者”的游戏。

我已经编写了一些工作代码,但问题来自中断 0x16 AH=0x01。
Ralf Brown 的中断列表中我们可以看出这个中断不会清除键盘缓冲区。因为在点击任何控制键一次后,我的游戏认为这个键一直按下,其他按键被忽略,导致我的船向一个方向无限前进。

我曾尝试使用 AH=0x00 并且它工作得很好,但是这会在按下任何键之前停止游戏,我不希望那样,因为我将无法在不等待用户输入的情况下更新敌人的位置。

我认为这是 int 0x16 AH=0x01 的问题并且缓冲区没有被清除,但是它可能与 mylup或 call 有关keyPressControl

顺便说一句,我使用 bochs 来测试我的代码并使用 nasm 编译我的代码

这是我的代码:

org 0x7C00
bits 16

xor ax,ax
mov ds,ax
mov es,ax

mov bx,0x8000
cli
mov ss,bx
mov sp,ax
sti

cld
clc

;clear 0x7E00 so we can check is code loaded later
xor ah,ah
mov BYTE [0x7E00], AH

;this code suppose to load game into memory
mov ah,0x2
mov al,0x4
xor ch,ch …
Run Code Online (Sandbox Code Playgroud)

assembly nasm bare-metal

2
推荐指数
1
解决办法
1169
查看次数

保护模式x86中的64位寄存器

我想知道在保持32位保护模式时我能否在64位处理器上使用64位寄存器.我自己无法测试,因为我的虚拟机不支持64位长模式.我也无法在互联网上找到这个.我认为这可能是可能的,因为32位寄存器可用于16位实模式.

assembly bare-metal protected-mode cpu-registers

0
推荐指数
1
解决办法
136
查看次数