16位段和32位段

来源:互联网 发布:cctv怀旧源码新势力 编辑:程序博客网 时间:2024/04/30 22:05
16位段和32位段的根本区别是什么?
MASM把USE16、USE32用在SEGMENT后面来说明段的属性,NASM用 
[SECTION   .s16] 
[BITS   16] 
和 
[SECTION   .s32] 
[BITS   32] 
1.来说明使用的是16位还是32位段,大家有没有想过16位段和32位段到底有什么区别?描述符中的D位究竟有什么作用? 
2.还有就是实模式下的16位的BIOS例程,在保护模式下究竟还能不能使用?(大家一定知道,如果能在保护模式下使用BIOS例程将有什么样的重要意义。)提出这个问题供大家探讨。 

我对第二个问题的答案是肯定的。

------解决方案--------------------
机器指令不一样 
------解决方案--------------------
机器码的区别,主要体现在对MOD/RM的解释上(对SIB也有影响,暂且不提) 
IA32的机器码: 前缀+操作码+MOD/RM+SIB+Displacement+立即数 
其中MOD/RM是操作数的主要组成部分,表示需要访问的寄存器/内存 
在16位和32位模式下,CPU对于MOD/RM的解释有很大的区别 
简单来说,就是在32位下不能使用16位内存地址,不能使用16位偏移量,也不能使用ax等16位寄存器 

也许有人要骂我吹牛,谁说32位模式不能用ax!! 
请写一个两行的汇编语言 
[bits 32] 
mov ax,5 
然后用nasm汇编一下 
出来的机器码是不是66 xx xx xx?? 
66H就是指令前缀,表示该指令强制运行在相反的指令长度模式
0 0
原创粉丝点击