标签:操作系统 boot 打印 程序 实验 寄存器 字符串 搭建
实验目的:
搭建基本实验环境,熟悉基本开发与调试工具
实验内容:
认真阅读章节资料
在实验机上安装virtualbox,并安装ubuntu
安装ubuntu开发环境,32位环境
下载bochs源码,编译并安装bochs环境
使用bochs自带工具bximage创建虚拟软驱
阅读、编译boot.asm,并反汇编阅读
修改bochsrc,运行并调试你的第一个程序
实验要求:
删除AA55,观察程序效果,找出原因
修改程序中输出为,一个任意长度的打印字符串,调试程序
把生成的可执行文件反汇编,并设置断点进行调试,打印过程
回答:为什么要对段寄存器进行赋值
回答:如何在该程序中调用系统中断
实验所用设备:
VMWare Worksation
Ubuntu32位
实验步骤:
1.删除AA55,观察程序效果,找出原因
首先分析boot.asm文件,发现最后一行为:
dw 0xaa55 ; boot record signature
删除之前正常运行结果如下:
将最后一行删去后,再次运行:
发现报错,也没有弹出第一张图的界面。
原因:55aa为程序的结束点,从“boot record signature”也可以看出,此段为程序的必备段,如果被篡改或者删除必然导致程序不可执行。
2.修改程序中输出为,一个任意长度的打印字符串,调试程序
首先查看程序的反汇编:
可以发现他的字符串就是BootMessage那一行“ ”中的那些,我们将cx的值改为寄存器的极限值512,意味着可以打印512位字符串即可。
但是,这只是比较投机取巧的方法,还是应该写一个类似与strlen的函数,采用类似动态分配的思路进行打印,思路大致为进行一个循环,当读到正常字符时寄存器值++,当读取到字符串结尾’00’时结束,并返回计数值。
3.把生成的可执行文件反汇编,并设置断点进行调试,打印过程
由于第一次调试,我不太确定应该在哪里下断点,所以我直接从头开始输入n,单条语句执行。
进行到这里,才发现了右边的虚拟电脑的变化,之前都是黑屏状态。
进行到这里,再次发生了变化,可以看到下图中,和上图的最大区别就是成功打印了字符串。
与此同时,程序再输入n就没有变化了。
红框显示可以看到,已经成功boot了。
思考
回答:为什么要对段寄存器进行赋值
段寄存器:是因为对内存的分段管理而设置的。在进行内存分段时,段的部分信息将被写入段寄存器中以保存当前内存的分段模式。操作系统即使是最简单的操作系统,也是一个程序,也需要占用内存来运行,所以给段寄存器赋值是不可避免的。
回答:如何在该程序中调用系统中断
应该有很多种方法,最常见的方法就是将程序打印的字符串以用户输入的形式来赋值,c语言就是使用scanf函数来获取,这样就可以调用系统中断,等待键盘输入。
标签:操作系统,boot,打印,程序,实验,寄存器,字符串,搭建 来源: https://blog.csdn.net/HizT_1999/article/details/106973849
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。