8 个解决方案
#1
pe的section和汇编里的segment没什么关系,masm中用segment指示符来定义section,我觉得是遗留问题
16位exe中一般都为每个段寄存器分配了一块空间,所以exe中的一块内存和一个段对应
但32位中就没有这个关系了
16位exe中一般都为每个段寄存器分配了一块空间,所以exe中的一块内存和一个段对应
但32位中就没有这个关系了
#2
正因为是虚拟线性地址,才需要用段选择子等,映射成独立的物理地址上去。
#3
我看了罗云彬的32位汇编,里面有图,是只要是用到段选择子的时候都会通过地址转换转换成虚拟线性地址,指令使用的都是虚拟线性地址,如果开启分页管理,那么就是映射后找到物理地址,如果没开启就直接是物理地址。指令中用的都是32位虚拟线性地址,寄存器也是32位的,根本涉及不到段选择器。那么这种分段还有什么用呢。
#4
指令用的是段偏移,分段还是会起作用,只不过windows使用扁平寻址模式,把cs,ds,es,ss的基地址设为0,界限为4G,因此这几个段中逻辑地址的段偏移就是线性地址
分段肯定有用,比如代码段的特权级
分段肯定有用,比如代码段的特权级
#5
pe文件中的区段和汇编中的段压根就一点关系没有
32位汇编的段里面的东西跟16位都己经完全不一样了
32位汇编的段里面的东西跟16位都己经完全不一样了
#6
如果是DLL的话那么CS,DS,ES,SS也都是基址是0界限是4G吗?我看到说32位汇编直接寻址的时候才需要重定位,32位汇编里的直接寻址指的是相对于段的偏移还是线性地址?我用OD反汇编也看了,好像都是相对于段的偏移,跳转和CALL也是相对于CS的偏移吧?为什么间接寻址就不需要重定位?16位汇编涉及到段寄存器操作的时候才需要重定位,指的是只有给段寄存器赋值等的时候才需要?根据当前载入的内存区域重定位段基址?
如果说3位汇编里DLL的段基址也都是0,直接寻址和间接寻址最后得到的都是偏移地址的话,那么不是所有的寻址都需要重定位?如果DLL的基址随载入的内存区域改变的话那么为什么直接寻址还需要重定位呢?
#7
32位的pe重定位和段无关,段寄存器和dll,exe无关
windows就几个段描述符,cs(内核),cs(用户),ss(内核),ss\ds\es(用户),fs(内核),fs(用户)
我的计算机中:
线程在内核模式就用cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000
用户模式就用cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
不管哪个进程,哪个模块都一样
windows就几个段描述符,cs(内核),cs(用户),ss(内核),ss\ds\es(用户),fs(内核),fs(用户)
我的计算机中:
线程在内核模式就用cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000
用户模式就用cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
不管哪个进程,哪个模块都一样
#8
学习了。。。
#1
pe的section和汇编里的segment没什么关系,masm中用segment指示符来定义section,我觉得是遗留问题
16位exe中一般都为每个段寄存器分配了一块空间,所以exe中的一块内存和一个段对应
但32位中就没有这个关系了
16位exe中一般都为每个段寄存器分配了一块空间,所以exe中的一块内存和一个段对应
但32位中就没有这个关系了
#2
正因为是虚拟线性地址,才需要用段选择子等,映射成独立的物理地址上去。
#3
我看了罗云彬的32位汇编,里面有图,是只要是用到段选择子的时候都会通过地址转换转换成虚拟线性地址,指令使用的都是虚拟线性地址,如果开启分页管理,那么就是映射后找到物理地址,如果没开启就直接是物理地址。指令中用的都是32位虚拟线性地址,寄存器也是32位的,根本涉及不到段选择器。那么这种分段还有什么用呢。
#4
指令用的是段偏移,分段还是会起作用,只不过windows使用扁平寻址模式,把cs,ds,es,ss的基地址设为0,界限为4G,因此这几个段中逻辑地址的段偏移就是线性地址
分段肯定有用,比如代码段的特权级
分段肯定有用,比如代码段的特权级
#5
pe文件中的区段和汇编中的段压根就一点关系没有
32位汇编的段里面的东西跟16位都己经完全不一样了
32位汇编的段里面的东西跟16位都己经完全不一样了
#6
如果是DLL的话那么CS,DS,ES,SS也都是基址是0界限是4G吗?我看到说32位汇编直接寻址的时候才需要重定位,32位汇编里的直接寻址指的是相对于段的偏移还是线性地址?我用OD反汇编也看了,好像都是相对于段的偏移,跳转和CALL也是相对于CS的偏移吧?为什么间接寻址就不需要重定位?16位汇编涉及到段寄存器操作的时候才需要重定位,指的是只有给段寄存器赋值等的时候才需要?根据当前载入的内存区域重定位段基址?
如果说3位汇编里DLL的段基址也都是0,直接寻址和间接寻址最后得到的都是偏移地址的话,那么不是所有的寻址都需要重定位?如果DLL的基址随载入的内存区域改变的话那么为什么直接寻址还需要重定位呢?
#7
32位的pe重定位和段无关,段寄存器和dll,exe无关
windows就几个段描述符,cs(内核),cs(用户),ss(内核),ss\ds\es(用户),fs(内核),fs(用户)
我的计算机中:
线程在内核模式就用cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000
用户模式就用cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
不管哪个进程,哪个模块都一样
windows就几个段描述符,cs(内核),cs(用户),ss(内核),ss\ds\es(用户),fs(内核),fs(用户)
我的计算机中:
线程在内核模式就用cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000
用户模式就用cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
不管哪个进程,哪个模块都一样
#8
学习了。。。