- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在写小型操作系统-用于练习。我从引导加载程序开始。我想创建一个以16位实模式运行的小型命令系统(目前)。
我已经创建了引导加载程序,用于重置驱动器,然后在引导加载程序之后加载扇区。
问题是因为在jmp
函数之后实际上什么也没发生。
我没有尝试在下一个扇区加载0x7E00(我不完全确定如何使用es:bx指向地址,所以可能是个问题,我相信它的Address:offset)只是在引导加载程序之后。
这是代码:
;
; 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
error:
mov si,MSGError
.loop:
lodsb
or al,al
jz .end
mov ah,0x0E
int 0x10
jmp .loop
.end:
hlt
MSGError db "Error while booting", 0x0
times 0x1FE - ($ - $$) db 0x0
db 0x55
db 0xAA
;
; SECTOR 0x1
;
jmp printtest
;definitions
MSGLoaded db "Execution successful", 0x0
;
; Print function
; si - message to pring (NEED TO BE FINISHED WITH 0x0)
printtest:
mov si,MSGLoaded
.loop:
lodsb
or al,al
jz .end
mov ah,0x0E
int 0x10
jmp .loop
.end:
hlt
times 0x400 - ($-$$) db 0x0
最佳答案
此代码的主要问题是:
ES:BX指向错误的segment:offset以将内核加载到
加载了错误的扇区,因此内核不是预期的
第一个在此代码中:
mov bx,0x7E00
mov es,bx
xor bx,bx
0x0000:0x7E00
(ES:BX)。此代码将ES:BX设置为
0x7E00:0x0000
,该解析为物理地址
0x7E000
((0x7E00 << 4)+ 0x0000)。我认为其目的是将
0x07E0
加载到ES中,这将产生
0x7E00
的物理地址((0x07E0 << 4)+ 0x0000)。您可以了解有关16:16内存寻址计算
here的更多信息。将段乘以16等于将其左移4位。
mov ah,0x02 ;function
mov al,0x1 ;sectors to read
mov ch,0x0 ;tracks
mov cl,0x2 ;sector number
mov dh,0x0 ;head
int 0x13
mov cl,0x2 ;sector number
lodsb
,
movsb
等使用的方向标志可以设置或清除。如果方向标志设置不正确,SI / DI寄存器的方向可能会调整错误。使用
STD
/
CLD
将其设置为所需的方向(CLD =前进/ STD =后退)。在这种情况下,代码假定向前移动,因此应使用
CLD
。有关更多信息,请参见
instruction set reference
xor ax,ax ; We want a segment of 0 for DS for this question
mov ds,ax ; Set AX to appropriate segment value for your situation
mov es,ax ; In this case we'll default to ES=DS
mov bx,0x8000 ; Stack segment can be any usable memory
cli ; Disable interrupts to circumvent bug on early 8088 CPUs
mov ss,bx ; This places it with the top of the stack @ 0x80000.
mov sp,ax ; Set SP=0 so the bottom of stack will be @ 0x8FFFF
sti ; Re-enable interrupts
cld ; Set the direction flag to be positive direction
MOV
更改)时,处理器应该关闭该指令的中断,并保持中断状态直到下一条指令之后。通常,如果您在更新SS之后立即更新SP,则无需担心禁用中断。在早期的8888处理器中存在一个错误,此错误没有兑现,因此,如果您瞄准的是最广泛的环境,则可以肯定地禁用并重新启用它们。如果您不想使用越野车8088,则可以在上面的代码中删除
CLI
/
STI
指令。我在80年代中期在家用PC上所做的第一手资料就知道该错误。
0x8000
(SS)。然后,将堆栈指针(SP)设置为
0
。当您在16位实模式下
push something on the stack时,处理器首先将堆栈指针减2,然后在该位置放置一个16位WORD。因此,第一次压入堆栈的位置为0x0000-2 = 0xFFFE(-2)。然后,您将拥有一个
0x8000:0xFFFE
的SS:SP。在这种情况下,堆栈从
0x8000:0x0000
运行到
0x8000:0xFFFF
。
JMP
看起来像这样:
jmp 0x07E0:0x0000
db 0x0ea ; Far Jump instruction
dw 0x0000 ; Offset
dw 0x07E0 ; Segment
ljmpw $0x07E0,$0x0000
关于assembly - 引导加载程序不会跳转到内核代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32701854/
我有两个函数,在 C++ 中看起来像这样: void f1(...); void f2(...); 我可以更改 f1 的主体,但是 f2 是在另一个我无法更改的库中定义的。我绝对必须(尾部)在f1 中
我正在尝试避免这个 while 循环出了什么问题 while True: start = input("Ok, are you ready now?\n") if (start !=
当我点击按钮加载页面时,它加载正常。调整浏览器大小后,此页面会不断刷新。我复制了布局页面的一部分,用于处理按钮。如果我遗漏了什么,你能告诉我吗? Statistics 最佳答案 确保没有在“调
PHP的header函数 可以很少代码就能实现HTML代码中META 标签 这里只说用 header函数来做页面的跳转 1. HTML代码中页面的跳转的代码 HTML meta refresh 刷
我使用并喜欢 Tim Pope's excellent Fugitive plugin for VIM ,我一直希望能够加载 :Glog quickfix 中所有文件的差异,并通过它们循环到 HEAD
当我访问 my_site.com/page.php#something 时,滚动位置是携带此特定主题标签的元素之一,而不是页面顶部。 执行 window.scrollTo(0, 0); 不会改变这一事
在我自己的一个应用程序中看到这一点后,我构建了一个测试应用程序。 我在导航 Controller 中嵌入了一个集合 View 。 这一切都链接到 ViewController 类。 class Vie
在我们的应用程序中,当其中一个 View 被推送到导航 Controller 时,导航栏会显示 5 秒,然后我们将 navigationBarHidden 设置为 TRUE。稍后,如果用户点击屏幕,我
我必须更新滚动 UITextView 中的少量文本。我只会在光标当前所在的位置插入一个字符,并且只需按一下导航栏上的按钮即可执行此操作。 我的问题是,每当我调用 TextView 的setText方法
我正在使用第三方脚本(详细信息如下)将表单分解为多个 ajax 页面。当我单击前进到下一页时,它会跳转到表单顶部的 anchor 。这是一种不必要且不和谐的行为,我想阻止它发生。这个脚本不是我写的,不
这个问题已经有答案了: Call an absolute pointer in x86 machine code (2 个回答) 已关闭 4 年前。 我正在用 C 语言为 x86_64 linux 编
查看objdump -d ELFfile的输出,我无法区分直接和间接跳转/调用。有什么建议吗? 最佳答案 间接调用和跳转有*在指令之后和位置之前,如callq *%r13和jmpq *0x204d8a
我试图通过单击 anchor 链接来突出显示 div。我的意思是如果我点击My link 然后滚动到 here在此页面上,我有很多 anchor 链接和 div,因此很难识别哪个 div 然后滚动,因
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
没有任何编程经验,只有基本的 html/css。我正在尝试创建一个 javascript 菜单(如果有更简单的方法,可以接受建议吗?),它将根据第一个菜单中选择的选项显示/隐藏?我有以下... Q
我正在使用 jquery 的 scrollTop 函数,但无法弄清楚为什么在同一项目上多次调用时它会跳来跳去。 我把这个 example 放在一起了来说明问题。单击测试按钮时,它会交替滚动到指定的项目
我已经创建了一个关于 Storyboard的项目, Storyboard上有两个名为“loginViewController”、“BViewController”的 View Controller ,
基本上,我在网站的最顶部有一个我想隐藏的 div,当您单击一个按钮时,它会将整个网站向下推并显示其内容。与此非常相似 nd.edu (单击标题右侧的帮助中心或白杨站点)。我正在使用 jquery 来完
当我单击所单击的 div 旁边的 div 框时,我的底部 div 会上下跳跃 这是 fiddle 的链接 http://jsfiddle.net/abtPH/17/ 这是我的jquery $('li
我在悬停时调整 .main-partners div 中卡片的大小,以便出现 查看更多 按钮。 我的问题是当我 :hover 在 .main-partners 中的卡片 (.main-card) 上时
我是一名优秀的程序员,十分优秀!