2015-11-19 60 views
0

是否可以訪問具有負索引的分段寄存器? 如果是,那麼結果是什麼?這甚至有意義嗎?負片段指數?

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

mov rdx, fs:[rcx] 
+1

順便說一句,你不需要加載64位常量;有一個'mov r64,imm64'。 AT&T語法使用'movabs',而NASM/YASM自動使用它而不是截斷常量,當它們不適合32位符號擴展的'mov r64,imm32'時。 (一些彙編程序也可能彙編成零擴展的mov r32,imm32。) –

回答

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:對不起,我得到這個錯誤在第一時間周圍。