在<80x86汇编语言程序设计教程>中,有以下一段话:
在80386保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。段属性中有一位对此进行定义,把该位成为粒度位,用符号G标记。G=0表示段界限以字节位位单位,于是20位的界限可表示的范围是1字节至1M字节,增量为1字节;G=1表示段界限以4K字节为单位,于是20位的界限可表示的范围是4K字节至4G字节,增量为4K字节。当段界限以4K字节为单位时,实际的段界限LIMIT可通过下面的公式从20 位段界限Limit计算出来:
LIMIT=limit*4K+0FFFH=(Limit SHL 12)+0FFFH
请教高手,为何是 " limit*4K+0FFFH "? 而不是直接的limit*4K ? 后面的
"(Limit SHL 12)+0FFFH "又是什么意思 ?
不得其解 . 请指点.
------解决方案--------------------------------------------------------
Limit SHL 12
是左移12位,相当于乘4K。
------解决方案--------------------------------------------------------
Limit SHL 12与limit*4K等价。
》为何是 " limit*4K+0FFFH "? 而不是直接的limit*4K ?
这个问题我也考虑过,个人认为开发者怕用户定义0大小的段,所以默认使用4K,就是表达式中加进去的0FFFH,因此即便定义为0时,也能保证段值是有效的,也可能还有其它原因。
------解决方案--------------------------------------------------------
shl 12可以看作*4K,shl后的立即数可以大于1也是80386以后的改进。
0fffh可以将最小大小的段占用,同意楼上的观点。