汇编前置知识学习 第11-13天

今天要做什么?

1:虚拟机准备环境

2:virtualBox 创建虚拟硬盘,配置bochs文件启动

一:

VMDK(VMWare 虚拟机)

VDI(VirtualBox虚拟机)

VHD(virtual-PC/Hyper-V 虚拟机)

Vhd 文件分析:

在以512一个扇区的磁盘映像中,第一个扇区是0000 0000 - 0000 0200 0面0柱1扇区

第二个 0面 0柱 2扇区

文件的尾部:

Conectix 标志 用来告诉打开他的虚拟机,这是一个合法的的vhd文件

固定大小的的vhd文件简单,可以使用简单的方法写入虚拟硬盘,这可以简化我们的工作和学习过程。

二:

把创建的虚拟硬盘分配给空磁盘设置虚拟机

将生成的配置文件放到bochs安装文件目录,用调试方式启动bochs模拟器,进入相应磁盘映像,开始调试

2:创建主引导扇区程序

把一个程序放到主引导扇区,让计算机在启动后执行它。为此,这一课将演示如何编辑和编译这样一个符合要求的汇编语言程序。

asm文件编译成bin后 进行二进制分析

nasm exam.asm -f bin exam1.bin

B8 30 00 代表第一条编译后的指令 (低端字节序)B8 (操作码) 00 30

BA C0 00 代表第二条编译后的指令 (低端字节序)BA (操作码) 00 C0

引导扇区512个字节,目前只有八个字节,而且最后两个字节必须是55 AA,所以中间需要填充502个东西。

DB 向文件中添加一个字节的数据

什么是伪指令?并不是真正代表的处理器指令,而是一个让编译器做事,而不是处理器做事

nasm 给我们添加了另外一个编译器伪指令 times

Times 502 db 0 嵌套伪指令 输出502个 db 0

最后写上 db 0x55

db 0x AA

然后将 生成的bin文件,写入创建好的learn.vhd

传统上,我们读写硬盘 必须读取磁头号、柱面(磁道)号、和扇区号但这里并不是这样,这里需要指定逻辑扇区号。

通常一个扇区是512个字节

为了更好的区分扇区,引入了逻辑块(LBA)Logical Block Address地址的概念。

假定某硬盘有2个磁头100个柱面(磁道),每磁道有17个扇区。那么:

逻辑0扇区对应着0面0道1扇区

逻辑1扇区对应着0面0道2扇区

。。

逻辑16对应着0面0道17扇区;

逻辑17扇区对应着1面0道1扇区

逻辑18扇区对应着1面0道2扇区

。。。

逻辑33扇区对应着1面0道17扇区

逻辑34扇区对应着0面1道1扇区

逻辑35扇区对应着0面1道2扇区

要注意到,扇区在编号是,是以柱面(磁道)为单位的,即 先是0面 0道,接着是1面0道,直到把所有盘面上的0磁道处理完,在接着处理下一个柱面。之所以这样做,是因为要加速硬盘的访问速度,最好是尽可能不移动磁头

这里一共有3400个扇区,最后一个逻辑扇区的编号是3399,对应着 1面 99道 17扇区,这也是整个硬盘上最后一个物理扇区。

若已知物理扇区的位置是位于H面(头)、

C道的第S个扇区,则他的逻辑扇区号是:

C * 磁头总数*每道扇区数+H*每道扇区数+(s-1)

用工具把生成的bin文件写入刚才创建的 vhd文件

3:调试主引导扇区程序,来了解Bochs虚拟机的软件调试环境

3.1

启动后,显示一系列状态信息,启动工作和一些模块,再加电后 取指令 执行

Bochs不同,取第一条指令之前,会停下来,等待调试指令

3.2

准备取用第一条指令,但是还有没取,也没有执行

0x0000 ffff fff0 \]是物理地址,f000:fff0是逻辑地址(段寄存器cs和偏移地址) 用的不是8086处理器,所以段寄存器这里不一样 8086重置后是FFFF,这个是FFF0 段地址f000左移四位,再加上后面的偏移地址fff0 等于ffff0,但是这里的物理地址是很长的0x0000 ffff fff0,这里是不一致的,原则上应该是一致的。有别的原因 后面jmpf 是一条跳转指令,后面的:ea5be000f是时钟数,每模拟执行一条指令之后,这个时针滴答一次,这个时钟的值是 已经执行的指令数。 输入 sreg 会显示很多段寄存器的内容 输入 r 显示所有的通用寄存器 AX 包含AH和AL 是16位的寄存器,EAX是32位的寄存器,RAX是64位的寄存器,其他的通用寄存器是一样的 ![](https://i-blog.csdnimg.cn/direct/60c043f41d784cfbba2db3dfe74f1596.png) ![](https://i-blog.csdnimg.cn/direct/f8f493c18a934e41a23b526d90ccbc07.png) ![](https://i-blog.csdnimg.cn/direct/87b9d76914564a12a6e3fb7909d33287.png) ![](https://i-blog.csdnimg.cn/direct/7fb48a9c7ab04bacacb2694ecc6723fb.png) ![](https://i-blog.csdnimg.cn/direct/4bbfe9f58ea34d4c8bd3d04e2ca50e59.png) ![](https://i-blog.csdnimg.cn/direct/1d432dc560af4327a9dc89ca977c9126.png) 如果计算机的设置是从硬盘启动,那么rom bios将读取硬盘主引导扇区的内容,执行跳转指令JMP 0x0000: 0x7c00(这条指令是离开ROMBios时所执行的最后一条指令),主引导扇区里面,有些代码指令,从硬盘的其他部分读取代码指令,用来接力执行,操作系统启动 ![](https://i-blog.csdnimg.cn/direct/10519bc6a33e4b96823a93b719ba120f.png) AX、BX、CX、DX、SI、DI、SP、BP、IP 输入 sreg 会显示很多段寄存器的内容 输入 r 显示所有的通用寄存器 单步执行指令:输入框 输入S (step)单步 断点指令:b 所谓断点 这是一个内存地址,当处理器执行到这个地址时,指令停止 例如输入:b 0x7c00 ,到0x7c00 时,指令停止 输入C 时,不间断执行指令,如果我们设置了断点,他就会在断点处停下来 进入调试窗口,查看 段寄存器(输入sreg) 和通用寄存器 输入(r) 输入s单步执行指令 后 执行当前正在等待的指令,然后显示下一次将要执行的指令, ![](https://i-blog.csdnimg.cn/direct/b26c881d653b4b3ea7ba552ae7521993.png) 我们要注意,刚才已经执行了一条指令,意味着这条指令 将在t = 1的条件上执行,但是还没有执行。 此时 物理地址时\[0x 0000 000f e05b\]: f000:e05b (unk,ctxt),从地址可以看出,目前是在rom Bios里面执行,后面的 Xor ax, ax 是这条指令的汇编语言形式 :31c0 是这条指令的机器码

相关推荐
西岸行者2 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
我在人间贩卖青春2 天前
汇编之伪指令
汇编·伪指令
悠哉悠哉愿意2 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码2 天前
嵌入式学习路线
学习
毛小茛2 天前
计算机系统概论——校验码
学习
babe小鑫2 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms2 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下2 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。2 天前
2026.2.25监控学习
学习
im_AMBER2 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode