计算机流水线在正常程序中的体现(效果可视)

科技资讯 投稿 6700 0 评论

计算机流水线在正常程序中的体现(效果可视)

 

 

 

 

 1    mov eax,cr0 
 2    or eax,1 
 3    mov cr0,eax ;设置PE位    并以32位模式开始译码
 4    
 5    ;以下进入保护模式... ... 
 6    ;jmp dword 0x0008:flush ;16位的描述符选择子:32位偏移 
 7    
 8    ;清流水线并串行化处理器 
 9    [bits 32];将之后的代码全部解析成32位模式代码 
10    flush: 
11    mov cx,0100 ;加载数据段选择子(0x10 

1-3行就是将16位实模式转换到32位保护模式,并且将16位下的译码模式转换成32位的译码模式

第9行是一条对于编译器有作用的标签,和C语言中的#pragma comment差不多,这里的意思是之后的代码全部编译成32位的汇编

下面是运行时的反汇编代码

 这两条连续的反汇编指令是从汇编代码中的第三行开始的,我把汇编代码以及机器指令一并圈了出来

明明我们的操作数是cx,这边竟然变成了ecx,还有立即数,明明是0x0010,这边变成了0xd98e0010,也不怪大家看不出来,这换谁都一样

其实就是因为计算机流水线的缘故,大家可以回忆一下流水线的特性(不会等一条指令执行完了,再取下一条指令

我们再仔细观察一下第二条指令的机器代码, 66 b9 10 00 8e d9

32位模式下,将32位寄存器转成16位寄存器,

 

32位模式下这条指令是 :mov cx,0x0010(8e,d9之所以没了,就是因为cx装不下,本来这就是下一条指令的内容

很明显啊,我们的代码使用了16位下的解码方式,但是我们明明已经进入了保护模式

 

 可以看到,这下反汇编指令就是完全正确的了,也的确说明了流水线发生了暂停,不然我们解码肯定会以16位来解码

 

编程笔记 » 计算机流水线在正常程序中的体现(效果可视)

赞同 (34) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽