0
是否可以訪問具有負索引的分段寄存器? 如果是,那麼結果是什麼?這甚至有意義嗎?負片段指數?
mov rcx, cs:off_619528 ; 0xFFFFFFFFFFFFFFD0 -> -48
mov rdx, fs:[rcx]
是否可以訪問具有負索引的分段寄存器? 如果是,那麼結果是什麼?這甚至有意義嗎?負片段指數?
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:對不起,我得到這個錯誤在第一時間周圍。
順便說一句,你不需要加載64位常量;有一個'mov r64,imm64'。 AT&T語法使用'movabs',而NASM/YASM自動使用它而不是截斷常量,當它們不適合32位符號擴展的'mov r64,imm32'時。 (一些彙編程序也可能彙編成零擴展的mov r32,imm32。) –