负段索引?

Negative segment index?

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

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

mov   rdx, fs:[rcx]

显然在 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: 对不起,我第一次弄错了。