前文见此;

https://blog.csdn.net/bcbobo21cn/article/details/105314444

修改run.bat为:"C:\Program Files (x86)\Bochs-2.6.8\bochsdbg" -q -f bochsrc.bxrc;

然后run.bat,进入调试;

在<bochs:1>停住,此时仿真屏幕是空的,什么也没显示;

Bochs调试Linux内核初级入门2、bochs调试断点和单步指令、0x7c00、关中断和开中断指令-编程知识网

    此时应该是硬盘主引导记录装入内存,还未开始运行;一句指令也没执行;    主引导记录会存入内存地址0x7C00;

输入 vbreak 0x0000:0x7c00,打 c 继续执行;运行到0000:7c00,这里是一条cli指令;CLI指令,禁止中断发生;

同时仿真屏幕输出如下;

Bochs调试Linux内核初级入门2、bochs调试断点和单步指令、0x7c00、关中断和开中断指令-编程知识网

打 step 执行下一条指令看一下;这是一条jmp指令,屏幕没有变化;

Bochs调试Linux内核初级入门2、bochs调试断点和单步指令、0x7c00、关中断和开中断指令-编程知识网

再step,下一条指令是 mov ax, 0x07c0;

    0x07c0可能是等于0000:7c00,我还不是很清楚;我觉得应该是;   屏幕没有变化;

Bochs调试Linux内核初级入门2、bochs调试断点和单步指令、0x7c00、关中断和开中断指令-编程知识网

再往后单步,屏幕没有变化;

Bochs调试Linux内核初级入门2、bochs调试断点和单步指令、0x7c00、关中断和开中断指令-编程知识网

根据资料; 如下两句是设置数据段基地址;我还不清楚设置数据段基地址为0x07c0的意义;

    mov ax,0x07c0
    mov ds,ax

再往后单步,一直到如下图最后一条指令,屏幕没有变化;

既然有CLI指令,往后将能找到STI指令; STI,允许中断发生;到这里还没看到STI指令;

Bochs调试Linux内核初级入门2、bochs调试断点和单步指令、0x7c00、关中断和开中断指令-编程知识网

 

一些资料bochs调试的情况,0000:7c00处是如下的一条mov指令;跟这里前面不一样;我想可能是早一些的主引导记录情况,它没有关中断,直接mov ax, 0x7c0;前面的是先关了中断,再 mov ax, 0x7c0

        (0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x7c0             ; b8c007

mov ax, 0x7c0 和 mov ax, 0x07c0,应该是一样的;

 

网上有个资料;主引导记录反汇编以后的内容如下;

    MBR(Main Boot Record)主引导记录区位于硬盘0磁道0柱面1扇区。

BEGIN:
0000:7C00 FA   CLI    关中断
0000:7C01 33C0   XOR AX,AX   设置堆栈段地址为0000
0000:7C03 8ED0   MOV SS,AX
0000:7C05 BC007C MOV SP,7C00   设置堆栈指针为7C00
0000:7C08 8BF4   MOV SI,SP   si=7c00
0000:7C0A 50   PUSH AX  
0000:7C0B 07   POP ES   ES=0000
0000:7C0C 50   PUSH AX  
0000:7C0D 1F   POP DS   DS=0000
0000:7C0E FB   STI    开中断
0000:7C0F FC   CLD    清除方向

……….

也是先关了中断,这点和前面是一样的;