码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【日拱一卒行而不辍20220920】自制操作系统


    13号中断

    功能:读写磁盘的中断调用,将指定扇区的代码加载到内存的指定位置

    int 0x13

    1. AH=0x02----要读磁盘内容到内存
    2. AL=0x04----要读4个扇区
    3. CL=0x02----要读的磁盘扇区从2号扇区开始.
    4. CH=0x00----要读的磁盘扇区所在的柱面号为0
    5. DH=0x00----要读的磁盘扇区所在的磁头号为0
    6. DL=0x00----要读扇区所在的驱动号为0
    7. AH=0x08----可以获得每个磁道的扇区个数
    8. CL低6位----存放每个磁道的扇区个数

    如何把第二个扇区及后续扇区的内容加载入内存并执行?不能是只在第一扇区进行操作了。

    加载第二扇区

    采用如下代码加载第二扇区的代码pmtest2.S。

    1. 1 [BITS 16]
    2. 2 org 0x7C00
    3. 3 start:
    4. 4 ; This section of code is added based on Michael Petch's bootloader tips
    5. 5 xor ax,ax ; 为 DS 置 0 准备
    6. 6 mov ds,ax
    7. 7 mov bx,0x8000 ; 栈段可以是可用内存的任意一段
    8. 8 mov ss,bx ; 栈顶位于 0x80000.
    9. 9 mov sp,ax ; 设置 SP=0 ,使栈底位于 0x90000 下
    10. 10 cld ; 设置 DF 位为正向
    11. 11 mov ah, 0x02
    12. 12 mov al, 1
    13. 13 mov ch, 0
    14. 14 mov cl, 2
    15. 15 mov dh, 0
    16. 16 mov bx, new
    17. 17 mov es, bx
    18. 18 xor bx, bx
    19. 19 int 0x13
    20. 20 jmp new:0
    21. 21 data:
    22. 22 new equ 0x0500
    23. 23 times 510-($-$$) db 0
    24. 24 dw 0xaa55
    25. 25 sect2:
    26. 26 mov ax, cs
    27. 27 mov ds, ax ; 设置 CS=DS. CS=0x0500, 因此 DS=0x500
    28. 28 ; 如果变量已经在代码中设置,则要求
    29. 29 ; 正确地引用其内存地址
    30. 30 mov ax, 0xB800
    31. 31 mov es, ax
    32. 32 mov byte [es:420], 'H'
    33. 33 mov byte [es:421], 0x48
    34. 34 mov byte [es:422], 'E'
    35. 35 mov byte [es:423], 0x68
    36. 36 mov byte [es:424], 'L'
    37. 37 mov byte [es:425], 0x28
    38. 38 mov byte [es:426], 'L'
    39. 39 mov byte [es:427], 0x38
    40. 40 mov byte [es:428], 'O'
    41. 41 mov byte [es:429], 0x18
    42. 42 mov byte [es:430], '!'
    43. 43 mov byte [es:431], 0x58
    44. 44 hlt

    在sect2中,也就是第二扇区中编写了部分演示代码。前两个扇区的二进制文件如下所示。

    shell脚本如下所示runboot.sh,生成两个扇区的虚拟硬盘镜像

    1. 1 #!/bin/bash
    2. 2 rm os.raw
    3. 3 nasm -o boot pmtest2.S
    4. 4 bximage -mode=create -hd=60 -q os.raw
    5. 5 dd if=boot of=os.raw bs=1024 count=1
    6. 6 qemu-system-i386 os.raw

    最终运行结果如下所示,显示了第二扇区的彩色的HELLO!

     

  • 相关阅读:
    Python常见问题
    通达信交易系统接口是不是免费的?
    借助reCAPTCHA实现JavaScript验证码功能
    面向对象编程在Perl中的实现:解锁Perl的OOP潜力
    JDK8内存溢出注意事项
    android studio开发flutter应用,使用mumu模拟器调试软件
    对西安交大轴承数据集XJTU-SY_Bearing_Datasets进行读取和处理:
    Redis实战之缓存:查询、添加缓存、更新缓存、缓存预热、缓存穿透、缓存雪崩、缓存击穿 解决方案及实例代码
    【025】mongoose V6.4开启debug日志打印
    C语言 之 多线程编程
  • 原文地址:https://blog.csdn.net/bear_miao/article/details/126958521
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号