Pointers 当使用地址重写以较小的地址空间为目标时,指令指针会发生什么情况?

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个最高

当使用地址重写以较小的地址空间为目标时(例如,默认为32位地址,但重写转换为16位地址),指令指针会发生什么变化

假设我们处于x86-32模式,默认情况下,当前代码段的内存空间为32位

此外,IP寄存器包含值87654321h

如果我使用67h来覆盖默认值,并为一条指令设置16位的内存空间,那么处理器如何计算当前代码段中的偏移量

IP中的某些位必须被忽略,否则您将超出覆盖指定的16位内存空间

那么,处理器是否忽略了IP寄存器中的8765部分

也就是说,处理器是否只使用4个最低有效位而忽略4个最高有效位

与数据段访问相关的地址覆盖情况如何

例如,我们在x86-32模式下,默认为32位内存寻址,并且我们使用67h前缀作为此指令:
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
可能会受到地址大小前缀的影响,因此这可能不属于无意义前缀的范畴,使用