您的位置:首页 > 编程语言

测试 orange 中代码产生的问题

2009-10-19 21:20 232 查看
 自己动手写操作系统 第二版 orange 测试

 

环境:

1 windows: 系统平台

2 windows版nasm: 用来编译代码

3 source insight: 编辑代码

4 beyond compare: 代码比较

5 vritual pc 2007:  虚拟出操作系统,使用virtual pc的原因主要是因为 virtual pc 中的msdos71虚拟机能使用share folders特性与windows方便的共享文件

6 msdos7: 虚拟操作系统,学习保护模式时需要

7 windows版 dd: 用来写虚拟磁盘,常用命令 dd if=xxx.bin of=yyy.img count=1 (windows下好像没有 conv=notrunc)

 

记得将 nasm、dd加入 path 环境变量中

在 source insight中添加一个options -> custom comand命令:cmd,并绑定到F12,用来快速打开 命令行窗口,custom command简单写为: cmd /k cd /d f:/my_os (其中f:/my_os为我的代码存放路径)

 

问题1: 测试pmtest1.asm时,msdos71虚拟机上出现 emm386 ... 提示信息,并且之后虚拟机无反应

解决:msdos71虚拟机启动后,使用edit 命令打开 config.sys文件,将其中的emm行使用 REM 注释掉。重启后此问题解决

 

问题2:在自己DispReturn的电脑上将 pmtest2.asm 敲了一遍进行测试,在virtual pc 2007 上进行测试的时候出现了虚拟机立即重启问题

解决:过程还有点曲折。对保护模式不太熟,看不出什么问题来,只得在代码中一次一次的添加 jmp $ 代码测试,却发现代码排错太慢,故先运行光盘上原始的代码测试,又发现了显示的信息 只是 FF FF FF ...,与书上描述不符。经过分析,发现是因为我创建虚拟机时,为了节约资源,只给虚拟机分配了4m的内存,而代码里面的 LABEL_DESC_TEST 的开始位置为 0500000h,即5m,我将代码改为 0300000h后,原始代码运行正确了。为免再发生内存过小问题,我将虚拟机的内存调高为24m。再回到我自己敲的pmtest2.asm,此时虚拟机仍然重启,jmp $,进行测试,发现在

call DispReturn


这行时开始有问题: 运行发现下一行输出覆盖了上一行输出,这可以推断是回车符没有效果,即 DispReturn 函数有问题,我仔细查看了我敲的pmtest2.asm与原始的区别,眼睛看花了,都没找出不同,但我将原始DispReturn拷贝到我的pmtest2.asm上时又有回车效果了,这说明肯定是我敲的代码的问题。没办法,我安装了 beyond compare 进行比较,我马上发现了问题所在: 我把 and 敲成了 add ,直接导致了问题,我把所有的代码都查了一遍,发现了几处上面的问题,修改完后,程序运行正确了

 

问题3:在测试pmtest3.asm时,自己敲入的代码编译后运行导致虚拟机操作系统重启

解决:同样使用 jmp $ 一部分、一部分的查询问题所在,最后测出是

call DispReturn


出的问题,但错误所在与上次不一样,这次是堆栈操作错误:进函数时将 eax、ebx入栈了,在出函数时却只将ebx出栈了,看来是漏敲了一行代码,添加后 pop eax 后继续测试,发现问题继续。哎,继续 jmp $,发现问题已经不在 call DispReturn, 而在 LABEL_SEG_CODE16 中,看了下,又是少敲了一行代码:mov ax, SelectorNormal,这引起了程序在返回16代码段时的ds,es,fs,ss,gs全部为未知数据,从而导致意外发生

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐