Pointers 当使用地址重写以较小的地址空间为目标时,指令指针会发生什么情况?
当使用地址重写以较小的地址空间为目标时(例如,默认为32位地址,但重写转换为16位地址),指令指针会发生什么变化 假设我们处于x86-32模式,默认情况下,当前代码段的内存空间为32位 此外,IP寄存器包含值87654321h 如果我使用67h来覆盖默认值,并为一条指令设置16位的内存空间,那么处理器如何计算当前代码段中的偏移量 IP中的某些位必须被忽略,否则您将超出覆盖指定的16位内存空间 那么,处理器是否忽略了IP寄存器中的8765部分 也就是说,处理器是否只使用4个最低有效位而忽略4个最高有效位 与数据段访问相关的地址覆盖情况如何 例如,我们在x86-32模式下,默认为32位内存寻址,并且我们使用67h前缀作为此指令:Pointers 当使用地址重写以较小的地址空间为目标时,指令指针会发生什么情况?,pointers,assembly,x86,memory-address,prefix,Pointers,Assembly,X86,Memory Address,Prefix,当使用地址重写以较小的地址空间为目标时(例如,默认为32位地址,但重写转换为16位地址),指令指针会发生什么变化 假设我们处于x86-32模式,默认情况下,当前代码段的内存空间为32位 此外,IP寄存器包含值87654321h 如果我使用67h来覆盖默认值,并为一条指令设置16位的内存空间,那么处理器如何计算当前代码段中的偏移量 IP中的某些位必须被忽略,否则您将超出覆盖指定的16位内存空间 那么,处理器是否忽略了IP寄存器中的8765部分 也就是说,处理器是否只使用4个最低有效位而忽略4个最高
mov-eax,[ebx]
现在,ebx包含一个32位的数字
67h覆盖是否将上述指令更改为:mov eax[bx]
“常量指针”呢?示例:mov-eax[87654321]
67h覆盖是否会将其更改为mov eax[4321]
内存覆盖是否也影响数据段的偏移量,还是仅影响代码段
地址重写如何影响堆栈指针
如果堆栈指针包含一个32位的数字(我们将再次使用87654321h)并且我按下或弹出,那么引用的内存是什么
推送和弹出间接访问内存
那么,您是否只使用IP寄存器中的4321位而忽略最高有效位
此外,细分市场基础本身如何
示例:我们处于x86-32模式,默认32位内存空间,但我们使用67h覆盖
CS寄存器指向GDT中的一个描述符,其段基也是lol,87654321h
我们立即超出了16位内存范围,甚至没有添加偏移量
处理器做什么?忽略4个最高有效位?同样的问题也适用于数据段和堆栈段的段描述符 0x67
是地址大小前缀。它改变指令中寻址模式的解释
它不会将机器暂时置于16位模式,也不会将EIP
截断为16位,也不会影响指令中未明确来自[寻址模式]
的任何其他地址
对于push/pop,屏幕上显示:
地址大小仅在引用内存中的源操作数时使用
因此,在32位模式下,a16推送eax
仍将设置esp-=4
,然后存储[esp]=eax
。它不会将ESP截断为16位。前缀将无效,因为唯一的内存操作数是隐式的而不是显式的
push[ebx]
受67
前缀的影响
db 0x67
push dword [ebx]
将解码为推送dword[bp+di],并从该16位地址加载32位(忽略这些寄存器的高16位)。(16位寻址模式使用与32/64不同的编码(没有可选的SIB字节)
但是,它仍然会更新完整的esp
,并存储到[esp]
(有关有效地址编码的详细信息,请参阅第2章:指令格式,表2-1(16位)与表2-2(32位)。)
在64位模式下,地址大小前缀将push[rbx]
变为push[ebx]
)
由于某些形式的
push
可能会受到地址大小前缀的影响,因此这可能不属于无意义前缀的范畴,使用这些前缀是保留的,并且可能会在未来的CPU中产生不可预测的行为。(). OTOH,这可能只适用于推送操作的push r/m32
操作码,而不适用于不能采用内存操作数的push r32
短格式
我认为,从措辞上看,英特尔的手册确实不能保证,即使是push ebx
的push r/m32
更长的编码,在未来带有67
前缀的CPU中也不会被解码为不同的东西。0x67
是地址大小前缀。它改变指令中寻址模式的解释
它不会将机器暂时置于16位模式,也不会将EIP
截断为16位,也不会影响指令中未明确来自[寻址模式]
的任何其他地址
对于push/pop,屏幕上显示:
地址大小仅在引用内存中的源操作数时使用
因此,在32位模式下,a16推送eax
仍将设置esp-=4
,然后存储[esp]=eax
。它不会将ESP截断为16位。前缀将无效,因为唯一的内存操作数是隐式的而不是显式的
push[ebx]
受67
前缀的影响
db 0x67
push dword [ebx]
将解码为推送dword[bp+di],并从该16位地址加载32位(忽略这些寄存器的高16位)。(16位寻址模式使用与32/64不同的编码(没有可选的SIB字节)
但是,它仍然会更新完整的esp
,并存储到[esp]
(有关有效地址编码的详细信息,请参阅第2章:指令格式,表2-1(16位)与表2-2(32位)。)
在64位模式下,地址大小前缀将push[rbx]
变为push[ebx]
)
由于某些形式的
push
可能会受到地址大小前缀的影响,因此这可能不属于无意义前缀的范畴,使用