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

发布于:2025-03-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

今天要做什么?

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位的寄存器,其他的通用寄存器是一样的

如果计算机的设置是从硬盘启动,那么rom bios将读取硬盘主引导扇区的内容,执行跳转指令JMP 0x0000: 0x7c00(这条指令是离开ROMBios时所执行的最后一条指令),主引导扇区里面,有些代码指令,从硬盘的其他部分读取代码指令,用来接力执行,操作系统启动

AX、BX、CX、DX、SI、DI、SP、BP、IP

输入 sreg 会显示很多段寄存器的内容

输入 r 显示所有的通用寄存器

单步执行指令:输入框 输入S (step)单步

断点指令:b  所谓断点 这是一个内存地址,当处理器执行到这个地址时,指令停止

 例如输入:b 0x7c00 ,到0x7c00 时,指令停止

输入C 时,不间断执行指令,如果我们设置了断点,他就会在断点处停下来

进入调试窗口,查看 段寄存器(输入sreg) 和通用寄存器 输入(r)

输入s单步执行指令 后 执行当前正在等待的指令,然后显示下一次将要执行的指令,

我们要注意,刚才已经执行了一条指令,意味着这条指令 将在t = 1的条件上执行,但是还没有执行。

此时 物理地址时[0x 0000 000f e05b]: f000:e05b (unk,ctxt),从地址可以看出,目前是在rom Bios里面执行,后面的

Xor ax, ax 是这条指令的汇编语言形式   :31c0 是这条指令的机器码


网站公告

今日签到

点亮在社区的每一天
去签到