我正在编写一个启动加载程序,我已经掌握了大部分细节,但我不确定为什么有些启动加载程序会在开始大量执行之前将它们重新定位在内存中.
有谁能解释一下?
此行为的一个示例是原始的v0.01 Linux内核引导加载程序,其中包含以下注释:
boot.s由bios-startup例程加载到0x7c00,并自行移动到地址0x90000,并跳转到那里.
我正在研究一个用于学习目的的小型引导程序.是否有关于bios中断调用所需的(自由)堆栈大小的规范/信息?
我正在使用NASM 16 BITS.我正在尝试做一个简单的汇编代码,打印0到255之间的数字,每个数字之间间隔1秒.这是我到目前为止:
[bits 16]
mov ax,cs
mov ds,ax
mov cx,255
mov ax,0
myloop:
;print in screen ax value
;wait 1 second
inc ax
loop myloop
Run Code Online (Sandbox Code Playgroud)
我不确定如何在屏幕上打印ax的值,以及如何等待1秒(将它们放在代码中的注释中).
我的朋友当时正在使用消费级台式设备安装一台无头服务器,他遇到了这个错误,毫无疑问,以前很多人都已经看过或读过这个错误,但是有人真的知道它为什么存在吗?
如果未检测到键盘或键盘控制器出现错误,您如何才能按一下按钮来恢复?
是几种BIOS制造商采用的某种复活节彩蛋还是真正的原因,为什么一个常见的默认BIOS设置是如果没有检测到键盘就不允许计算机启动,然后期望启动过程能够恢复通过某种方式按下一个键?
[来自互联网的示例] http://p.twimg.com/AsWYydvCEAAiAHL.jpg:large
我是认真的
MCGA支持4位颜色深度,即16种颜色.但是当我尝试打印所有这些颜色时,我只得到它们中的前8个,其余8个简单地复制它们,如下图所示.难道我在这里做错了,或者全是因为DOSBox?

代码(MASM,在DOSBox 0.74下):
TITLE PROGRAM193
;----------------------------------------------------------
.MODEL SMALL
.STACK 64
.DATA
;----------------------------------------------------------
.CODE
MAIN PROC FAR
MOV AX, @DATA
MOV DS, AX
MOV AX, 0600h ;AH = 06h (scroll up window)
; black (0)
MOV BH, 0Fh ;0 (black) background, F (white) text
MOV CX, 0000h ;upper line, left column
MOV DX, 004Fh ;finishing line, right column
INT 10h
; blue (1)
MOV BH, 1Fh
MOV CX, 0100h
MOV DX, 014Fh
INT 10h
; green (2)
MOV BH, 2Fh
MOV …Run Code Online (Sandbox Code Playgroud) 通过Ralph Brown的中断列表,我发现有许多不同的方法可以将文本字符输出到屏幕上.
ROM BIOS API提供以下功能:
DOS API提供以下功能:
这些功能有什么作用?我怎么称呼他们?我如何在它们之间做出选择?
有没有办法在实模式下列出BIOS驱动器索引(例如0x80,0x81 ......)?
我没有找到任何负责列出驱动器号码的中断!!
在几个资源中我发现: ROM 映像必须复制到 RAM 到 000C0000h 到 000DFFFFh。如果类代码表明这是 VGA 设备 ROM,则必须将其代码复制到从位置 000C0000h 开始的内存中。
1:如果我有PCI饥饿河马卡,ROM大于128KB怎么办?
2:如果我有 ROM 64KB 的常规 PCI 设备,但我有 4 个怎么办?它们是否按顺序加载到该内存范围中?如果是这样(尽管我对此表示怀疑),在 init 和 boot 阶段之间如何保存代码映像?
3:如果 BIOS 决定不遵循规范并指定不同的内存位置,会发生什么情况?为什么使用这个范围很重要?
4:普通机箱与VGA接口到底有什么不同?难道仅仅是限制造成了差异吗?
我现在正在尝试了解启动过程以及处理器如何初始化。我已阅读了多处理器规范部分B.4.2但我不明白什么INIT IPI和STARTUP IPI做的BSP和AP。
在我见过的每个引导加载程序代码中,文件开头都有这一行“ORG 0x7c00”。据我所知,BIOS会将这段代码放在地址0x7c00处。
那么执行“org 0x7c00”的原因是什么?是不是如果第一条指令加载到0x7c00,计数器就会自动从那里开始?每条指令的地址不都是0x7c00 + 偏移量吗?