相关疑难解决方法(0)

70
推荐指数
2
解决办法
6万
查看次数

典型地址

在阅读英特尔手册时,我遇到了以下情况:

*在支持Intel 64体系结构的处理器上,IA32_SYSENTER_ESP字段和IA32_SYSENTER_EIP字段必须包含规范地址.

我不明白'规范地址'的含义......?

很想得到一个解释;)找不到任何东西@ google

谢谢

assembly x86-64 intel virtual-address-space memory-address

7
推荐指数
3
解决办法
1687
查看次数

地址规范形式和指针算术

在符合AMD64标准的体系结构中,地址需要在取消引用之前采用规范形式.

英特尔手册的3.3.7.1节:

在64位模式中,如果微架构的地址位63到最重要的实现位被设置为全1或全零,则认为地址是规范形式.

现在,当前操作系统和体系结构中最有意义的实现位是第47位.这给我们留下了48位的地址空间.

特别是当启用ASLR时,用户程序可能会收到第47位设置的地址.

如果使用指针标记等优化并且高位用于存储信息,则程序必须确保将第48位至第63位设置回取消引用地址之前的第47位.

但请考虑以下代码:

int main()
{
    int* intArray = new int[100];

    int* it = intArray;

    // Fill the array with any value.
    for (int i = 0; i < 100; i++)
    {
        *it = 20;
        it++;   
    }

    delete [] intArray;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在考虑的intArray是,说:

0000 0000 0000 0000 0 111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100

设置itintArray并增加it一次,并考虑sizeof(int) == …

x86-64 pointer-arithmetic access-violation aslr

4
推荐指数
1
解决办法
1539
查看次数

为什么rsp寄存器从0x7FFFFFFFDD0开始

我正在学习x86汇编,使用下面的代码进行测试,我在gdb控制台中看到指向堆栈顶部的rsp寄存器从0x7FFFFFFFDFD0开始,如果我理解正确的话,在代码中我没有使用push或pop修改 rsp,因此 0x7FFFFFFFDFD0 它是默认值,这意味着我们在堆栈中具有相同的字节数,但我使用堆栈大小为 8mb 的 Linux

section .text
global _start
_start:

mov rcx, 2
add rcx, 8

mov rax, 0x1
mov rbx, 0xff
int 0x80
Run Code Online (Sandbox Code Playgroud)

linux assembly x86-64 stack-memory stack-pointer

3
推荐指数
1
解决办法
186
查看次数