负段指数?

时间:2015-11-19 14:23:50

标签: assembly x86 x86-64

是否可以访问具有负索引的段寄存器? 如果是,结果会是什么?这甚至有意义吗?

mov   rcx, cs:off_619528   ; 0xFFFFFFFFFFFFFFD0 -> -48

mov   rdx, fs:[rcx]

1 个答案:

答案 0 :(得分:1)

显然在64位模式下,cpu非常懒,只是将段基添加到给定的偏移量。因此,负值是有效的,并且按照预期的那样执行,即在分段基础之前的地址。但是,地址仍然需要有效。

示例代码:

#include <stdio.h>
#include <asm/prctl.h>
#include <sys/prctl.h>

int main()
{
    unsigned char* addr;
    unsigned char val;
    arch_prctl(ARCH_GET_FS, &addr);
    printf("FS base: %p\nold value: 0x%02x\n", addr, addr[-48]);
    addr[-48] = 0x42;
    printf("new value: 0x%02x\n", addr[-48]);
    __asm__ __volatile__ ( "movb %%fs:(%1), %0" : "=r" (val) : "r" (-48LL));
    printf("read using fs: 0x%02x\n", val);
    return 0;
}

示例输出:

$ ./a.out
FS base: 0x7ff053c03700
old value: 0x00
new value: 0x42
read using fs: 0x42

PS:对不起,我第一次出错了。