能力值:
( LV3,RANK:20 )
|
-
-
2 楼
jmp这句汇编有好几种类型 其中一种不常用的类型可以把实模式换倒到保护模式 那句jmp比较忽悠人 你看下机器码才会明白
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我用的汇编编译器是Nasm,它允许在整个地址前加上DWORD,而不仅仅是偏移地址前,所以可以在16的代码段中编译出32位的地址,用jmp dword SelectorCode32:0这一句就可以设置好cs和eip了,没必要像Linux内核一样用db定义这个jmp了。
而且mov cr0,eax的下一句才是jmp dowrd SelectorCode32:0,现在还没执行到jmp,执行到mov这一句时FreeDos就已经重启了。我试着将这一句用nop填充掉,然后直接在debug32中用r cr0来修改cr0寄存器,但也是一样的,只要一回车DOS就崩掉了。
要怎么样才能打开cr0寄存器的PE位,并且使我能在DOS环境下继续调试后面的保护模式下的代码呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
已解决,感谢天杀老大指点的方法。
在Bochs的配置文件里加上一句magic_break: enabled=1,然后在程序里加上一句xchg bx,bx,运行到这条指令时会断到Bochs调试器里。这样就可以继续调试下去了。
在Bochsrc_sample.txt里有提到过的,我居然没有仔细看。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
xiilin,你好!
我遇到了和你同样的问题,deug32调式有问题。
但是我用你说的方法试了但还是没能返回bochs的调试,下面是我的操作流程,您帮着给看看拿步出问题了。
1.修改bochsrc文件
在文件末尾增加“magic_break: enabled=1”
2.pmtest.asm文件中增加语句chg bx, bx,选了2个地方都没有成功
%include "pm.inc" ; 常量, 宏, 以及一些说明
;xchg bx, bx
org 0100h
;xchg bx, bx
jmp LABEL_BEGIN
3.启动bochs
bochs -f bochsrc
4.选择6
Please choose one: [6]
5.让bochs运行
<bochs:1> c 回车
6.在freedos中进入b盘,运行pmtest2.com
7.dos屏幕上显示处红色的打印字符串
未能成功的停在bochs中。
帮忙看看,我那里操作有问题阿?
谢谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我的Bochs版本是2.4.2,不知版本会不会有影响,因为你的步骤没问题。
我是把xchg bx,bx加在了org和jmp之间,程序运行后成功断下来了。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢回复!
问题找到了,原来是我没有把新编译生成的com文件拷贝到pm.img中。
比较低级的错误,惭愧。
|
|
|