是否可以访问具有负索引的段寄存器? 如果是,结果会是什么?这甚至有意义吗?
mov rcx, cs:off_619528 ; 0xFFFFFFFFFFFFFFD0 -> -48
mov rdx, fs:[rcx]
答案 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:对不起,我第一次出错了。