加载引导加载程序的第二阶段和/或将控制权转移给它时出现问题

2023-12-20

我的主引导记录代码:

;bit16                  ; 16bit by default
    org 0x7c00
    jmp short start
    nop
bsOEM   db "OS423 v.0.1"               ; OEM String

start:


;;cls
    mov ah,06h      ;Function 06h (scroll screen)
    mov al,0        ;Scroll all lines
    mov bh,0x0f     ;Attribute (lightgreen on blue) 
    mov ch,0        ;Upper left row is zero
    mov cl,0        ;Upper left column is zero
    mov dh,24       ;Lower left row is 24
    mov dl,79       ;Lower left column is 79
    int 10h         ;BIOS Interrupt 10h (video services)

;;print welcome msg
    mov ah,13h      ;Function 13h (display string), XT machine only
    mov al,1        ;Write mode is zero: cursor stay after last char
    mov bh,0        ;Use video page of zero
    mov bl,0x0f     ;Attribute (lightgreen on blue)
    mov cx,mlen     ;Character string length
    mov dh,0        ;Position on row 0
    mov dl,0        ;And column 0
    lea bp,[msg]    ;Load the offset address of string into BP, es:bp
                    ;Same as mov bp, msg 
    int 10h

;;load sector into memory & 5678h:1234h
    mov bx, 0x5678  ;segmented address
    mov es, bx      ;move segemented address to es
    mov bx,0x1234       ;base address to bx

    mov ah, 02      ;function read sectors
    mov al, 01      ;# of sectors to load
    mov ch, 00      ;track to read
    mov cl, 02      ;sector to read
    mov dh, 00      ;head to read
    mov dl, 00          ;drive number

    int 0x13            ;call interrupt 13 

    jmp 0x5678:0x1234       ;jump to memory address 


    int 20


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;variables;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg:  db 'Welcome to Pradox OS 0.1! Authored by Jiansong he', 10, 13, '$' 
mlen equ $-msg

padding times 510-($-$$) db 0       ;to make MBR 512 bytes
bootSig db 0x55, 0xaa       ;signature (optional)

用于 nasm 编译并将二进制文件放入我的 .img 软盘的终端命令:

第1行:定义一个名为boot.img的软盘,块大小512字节,总共2880字节

line2:使用nasm编译器,将mbr.asm文件编译为二进制格式,将其存储在名为mbr.bin的文件中(这是我的主引导记录)

line3: 将 dt.asm 编译为二进制文件 dt.bin

line4: 将mbr.bin的内容放入boot.img中,块大小512,总共放入1块

line5: 将dt.bin的内容放入boot.img中,块大小512,位于物理扇区#2(逻辑扇区#1)

dd if=/dev/zero of=boot.img bs=512 count=2880 

nasm -f bin mbr.asm -o mbr.bin

nasm -f bin dt.asm -o dt.bin 

dd if=mbr.bin of=boot.img bs=512 count=1 conv=notrunc

dd if=dt.bin of=boot.img bs=512 seek=1 count=1 conv=notrunc 

dt.asm 中的代码:

[BITS 16]               ;Set code generation to 16 bit mode

ORG 0x5647:0x1234       ;set addressing to begin at 579b4H

startdt:
  ;call cls ;call routine to clear screen
  ;call dspmsg  ;call routine to display message

  call date
  call cvtmo
  call cvtday
  call cvtcent
  call cvtyear
  call dspdate

  call time
  call cvthrs
  call cvtmin
  call cvtsec
  call dsptime

  int 20h ;halt operation (VERY IMPORTANT!!!)


cls:             
  mov ah,06h    ;function 06h (Scroll Screen)
  mov al,0  ;scroll all lines
  mov bh,0x0f   ;Attribute (bright white on blue)
  mov ch,0  ;Upper left row is zero
  mov cl,0  ;Upper left column is zero
  mov dh,24 ;Lower left row is 24
  mov dl,79 ;Lower left column is 79
  int 10H   ;BIOS Interrupt 10h (video services)
  ret


dspmsg: 
  mov ah,13h    ;function 13h (Display String)
  mov al,1  ;Write mode is zero
  mov bh,0  ;Use video page of zero
  mov bl,0x0a   ;Attribute (bright white on bright blue)
  mov cx,mlen2  ;Character length
  mov dh,0  ;position on row 0
  mov dl,0  ;and column 0
  lea bp,[welcom]   ;load the offset address of string into BP

  int 10H
  ret

welcom: db 'jiansong Hes first Operating System :D',10,13,'$'
mlen2 equ $-welcom;

date:
;Get date from the system
mov ah,04h   ;function 04h (get RTC date)
int 1Ah     ;BIOS Interrupt 1Ah (Read Real Time Clock)
ret

;CH - Century
;CL - Year
;DH - Month
;DL - Day

cvtmo:
;Converts the system date from BCD to ASCII
mov bh,dh ;copy contents of month (dh) to bh
shr bh,1
shr bh,1
shr bh,1
shr bh,1
add bh,30h ;add 30h to convert to ascii
mov [dtfld],bh
mov bh,dh
and bh,0fh
add bh,30h
mov [dtfld + 1],bh
ret

cvtday:
mov bh,dl ;copy contents of day (dl) to bh
shr bh,1
shr bh,1
shr bh,1
shr bh,1
add bh,30h ;add 30h to convert to ascii
mov [dtfld + 3],bh
mov bh,dl
and bh,0fh
add bh,30h
mov [dtfld + 4],bh
ret

cvtcent:
mov bh,ch ;copy contents of century (ch) to bh
shr bh,1
shr bh,1
shr bh,1
shr bh,1
add bh,30h ;add 30h to convert to ascii
mov [dtfld + 6],bh
mov bh,ch
and bh,0fh
add bh,30h
mov [dtfld + 7],bh
ret

cvtyear:
mov bh,cl ;copy contents of year (cl) to bh
shr bh,1
shr bh,1
shr bh,1
shr bh,1
add bh,30h ;add 30h to convert to ascii
mov [dtfld + 8],bh
mov bh,cl
and bh,0fh
add bh,30h
mov [dtfld + 9],bh
ret

dtfld: db '00/00/0000'

dspdate:
;Display the system date
mov ah,13h ;function 13h (Display String)
mov al,0 ;Write mode is zero
mov bh,0 ;Use video page of zero
mov bl,0x0f ;Attribute
mov cx,10 ;Character string is 10 long
mov dh,4 ;position on row 4
mov dl,0 ;and column 28
push ds ;put ds register on stack
pop es ;pop it into es register
lea bp,[dtfld] ;load the offset address of string into BP
int 10H
ret

time:
;Get time from the system
mov ah,02h
int 1Ah
ret

;CH - Hours
;CL - Minutes
;DH - Seconds

cvthrs:
;Converts the system time from BCD to ASCII
mov bh,ch ;copy contents of hours (ch) to bh
shr bh,1
shr bh,1
shr bh,1
shr bh,1
add bh,30h ;add 30h to convert to ascii
mov [tmfld],bh
mov bh,ch
and bh,0fh
add bh,30h
mov [tmfld + 1],bh
ret

cvtmin:
mov bh,cl ;copy contents of minutes (cl) to bh
shr bh,1
shr bh,1
shr bh,1
shr bh,1
add bh,30h ;add 30h to convert to ascii
mov [tmfld + 3],bh
mov bh,cl
and bh,0fh
add bh,30h
mov [tmfld + 4],bh
ret

cvtsec:
mov bh,dh ;copy contents of seconds (dh) to bh
shr bh,1
shr bh,1
shr bh,1
shr bh,1
add bh,30h ;add 30h to convert to ascii
mov [tmfld + 6],bh
mov bh,dh
and bh,0fh
add bh,30h
mov [tmfld + 7],bh
ret

tmfld: db '00:00:00'

dsptime:
;Display the system time
mov ah,13h ;function 13h (Display String)
mov al,0 ;Write mode is zero
mov bh,0 ;Use video page of zero
mov bl,0x0f;Attribute
mov cx,8 ;Character string is 8 long
mov dh,5 ;position on row 5
mov dl,0;and column 0
push ds ;put ds register on stack
pop es ;pop it into es register
lea bp,[tmfld] ;load the offset address of string into BP
int 10H
ret

int 20H

我的测试环境是dosbox,我可以成功在屏幕上显示欢迎消息,但无法将另一个扇区加载到从0x5647:0x1234开始的内存中 谢谢


够简单的。

您不能仅使用 OEM 字符串启动引导扇区!
您必须跳过此文本到真正的起点。
要么使用:

  • 3 字节近跳转
  • 一个 2 字节短跳转,后跟一个nop操作说明。

mov ch, 01      ;track to read
mov cl, 02      ;sector to read
mov dh, 01      ;head to read

如果要读取驱动器的第二个扇区,则需要指定 Cylinder=0、Head=0 和 Sector=2

mov ch, 0      ;track to read
mov cl, 2      ;sector to read
mov dh, 0      ;head to read

您的启动消息可能不会显示,因为您没有设置ES段寄存器。鉴于org 0x7C00需要设置ES=0。您不能相信 BIOS 会为您完成此操作。


您可能想要删除int 20来自程序的指令。它帮不了你。


而不是使用mov dl, 0要指定从中加载的磁盘,您最好使用DL注册您在 BIOS 首次调用引导扇区时获得的信息。像 DOSBOX 这样的模拟器可能会在这里使用一些特定的值!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加载引导加载程序的第二阶段和/或将控制权转移给它时出现问题 的相关文章

  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • 尝试理解 printf() 的 gcc 汇编输出

    我正在尝试学习如何理解汇编代码 因此我一直在研究 GCC 的汇编输出以获取一些愚蠢的程序 其中之一只不过是int i 0 我现在或多或少完全理解了其中的代码 最大的困难是理解散布的 GAS 指令 无论如何 我向前迈了一步并添加了printf
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 如何在线程创建和退出时调用函数?

    include
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 在汇编中,指令指定数据类型吗?

    我是汇编语言编程 x86 的初学者 以下说法是否正确 在汇编中 BYTE WORD DWORD 等数据类型分别表示 8 位 16 位和 32 位模式 而不仅仅是整数 它们本身没有意义 它们只是位模式 使用它们的指令赋予了它们意义 汇编 代码
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 将 1 字节立即值添加到 2 字节内存位置

    The add说明文档来 自这一页 http x86 renejeschke de html file module x86 id 5 html说如下 请注意我突出显示的两条说明 我在 NASM 中尝试了以下代码 符合第一个突出显示的指令
  • 如何创建可获取数字的小矮人计算机 (LMC) 代码。奇数时显示1,偶数时显示0

    我的研究需要帮助 如果数字是偶数 它可以显示 1 如果数字是奇数 它可以显示 0 例如 如果输入是 99 它将显示输出 1 这意味着奇数 如果我显示 10 它将显示输出 0 这意味着偶数 我没有任何代码 因为我不知道如何开始 请帮忙 我对这
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • 600 秒内无法报告状态。杀戮!报告 hadoop 的进度

    我收到以下错误 Task attempt 201304161625 0028 m 000000 0 failed to report status for 600 seconds Killing 为我的地图工作 这个问题类似于this ht
  • .filter 和 .includes 用数组过滤数组?

    我对 javascript 很陌生 正在学习一门课程来获得一些经验 但有时我对返回概念感到困惑 基本上这是我坚持的任务 有一系列不必要的单词 迭代数组以过滤掉这些单词 将剩余的单词保存在名为 betterWords 的数组中 有多种方法可以
  • 循环 FPS 下降的可能原因?

    我正在用 opengl 编写一个新的代码库 很早就遇到了一个奇怪的错误 这是重复且可预测的帧速率明显波动 我知道它绝对与渲染的对象成正比 它还与屏幕尺寸成正比 不是视口尺寸 不是窗口尺寸 只是物理设备尺寸 大约是 0 2 1 低 高 帧的比
  • Elasticsearch 映射未按预期工作

    具有以下映射 curl X PUT localhost 9200 cambio indice pretty true d mappings el tipo properties name type string age type integ
  • 是否可以将伪元素的堆叠顺序设置在其父元素下方? [复制]

    这个问题在这里已经有答案了 我正在尝试使用以下元素来设计元素的样式 after伪元素CSS选择器 element position relative z index 1 element after position relative z i
  • 使用 grouper 列出唯一值

    我有一个数据框 其中索引是日期时间 列 A 和 B 是对象 我需要每周查看 A 和 B 的独特值 我设法获得每周的唯一值计数 我正在使用 pd grouper 函数 但我很难获得每周的唯一值 此代码为我提供了每周的唯一值计数 df uniq
  • web.xml 顺序或过滤器和侦听器

    对于 Java EE Web 应用程序 我有一个实现 ServletRequestListener 的侦听器和一个过滤器 有没有办法在 web xml 中指定应该在侦听器之前调用过滤器 我已经尝试在侦听器之前声明过滤器及其映射 但监听器仍然
  • 如何根据回复动态显示星级?

    我需要根据响应动态显示星级 我能够显示从 1 到 5 的值 但如果评级为 0 则不会显示空星 如果评级 0 4 则也显示 1 颗星 我的控制器 function use strict angular var app angular modu
  • 拦截所有鼠标事件

    我正在寻找一种方法来拦截网页上的所有鼠标事件 尤其是点击 我的第一直觉是 body click 但是 如果为特定事件附加了任何其他处理程序 则这不会捕获该事件 将问题放在上下文中 我正在为我的网络应用程序编写一个 统计 模块 我们希望跟踪页
  • python进程之间共享资源

    我想在多个 python 脚本之间共享多个资源 理想情况下 我想做的是运行我的主程序 它包含一些脚本范围的变量 然后 我想将完全相同的程序分叉到一个新的 shell 中 并让它访问我的脚本范围变量 我正在研究多重处理 但我不确定另一种方法是
  • Perl 和 Python 之间正则表达式行为的差异?

    我有几个电子邮件地址 email protected cdn cgi l email protection and email protected cdn cgi l email protection 在 Perl 中 我可以采取To 原始
  • 在 CDH4.0.1 VM 上使用 MRV1 运行字数统计示例

    我从以下位置下载了虚拟机https downloads cloudera com demo vm vmware cloudera demo vm cdh4 0 0 vmware tar gz https downloads cloudera
  • 如何在 Spring Boot 单元测试中模拟 JWT 身份验证?

    我已使用 Auth0 将 JWT 身份验证添加到我的 Spring Boot REST API 中 如下所示这个例子 https auth0 com docs quickstart backend java spring security5
  • 将“RSA/ECB/PKCS7Padding”与 Bouncy Castle 一起使用

    我尝试使用 RSA ECB PKCS7Padding 进行加密 JCE 不支持它 所以我下载了Bouncy Castle 但Bouncy Castle似乎也不支持这种转换 以下代码 Security insertProviderAt new
  • 为什么一百万个双整型转换的执行时间与空循环相同?

    我正在编写一个具有大量 int double int 转换的高性能组件 因此我需要知道它们之间的执行时间 static double ToDouble int val gt double val static int ToInt doubl
  • 如何在Android项目的gradle中更改proguard映射文件名

    我有一个基于 gradle 的 android 项目 我想在为我的构建生成该文件名后更改它 如何做呢 upd 如何在 build gradle 中完成 由于我可以访问我的口味和其他硬性内容 因此我想根据口味 构建变体版本创建映射文件名 更简
  • ejabberd:从 mysql 数据库检索聊天历史记录

    我正在构建一个基于的聊天系统ejabberd http www ejabberd im 使用 iOS 客户端 以及XMPP框架 https github com robbiehanson XMPPFramework 我当前的聊天系统仅支持用
  • Robot Framework 中的静态变量

    机器人框架中是否有静态类型变量之类的东西 如果是这样我该如何调用它 或者是通过 python 文件来实现的解决方案 我试图解决的问题是 我希望设置一个变量一次 并让它记住设置的值 不幸的是 这个变量位于资源文件中 它与我的测试套件文件分开
  • 让 Scrapy 跟踪链接并收集数据

    我正在尝试在 Scrapy 中编写程序来打开链接并从此标签收集数据 p class attrgroup p 我已经设法让 Scrapy 收集给定 URL 的所有链接 但不跟踪它们 非常感谢任何帮助 你需要屈服Request http doc
  • 加载引导加载程序的第二阶段和/或将控制权转移给它时出现问题

    我的主引导记录代码 bit16 16bit by default org 0x7c00 jmp short start nop bsOEM db OS423 v 0 1 OEM String start cls mov ah 06h Fun