2012-02-12 2 views
11
 
void return_input (void) 
{ 
    char array[30]; 

    gets (array); 
    printf("%s\n", array); 
} 

После компиляции в GCC, эта функция преобразуется в следующий код Ассамблеи:Что такое% гс в Ассамблее

 
push %ebp 
mov %esp,%ebp 
sub $0x28,%esp 
mov %gs:0x14,%eax 
mov %eax,-0x4(%ebp) 
xor %eax,%eax 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x8048374 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x80483a4 
mov -0x4(%ebp),%eax 
xor %gs:0x14,%eax 
je  0x80484ac 
call 0x8048394 
leave 
ret 

Я не понимаю, две линии:

 
mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

Что такое% gs и что именно делают эти две строки?

Это команда компиляции:

 
cc -c -mpreferred-stack-boundary=2 -ggdb file.c 
+0

Я полагаю, что это регистры сегментов SS, DS, CS, ES, FS, GS. Если я понял это правильно. –

+1

Возможный дубликат [Что такое регистр «FS»/«GS», предназначенный для?] (Http://stackoverflow.com/questions/10810203/what-is-the-fs-gs-register-intended-for) –

ответ

16

GS является сегментный регистр, его использование в Linux можно прочитать на here (его в основном используется для в данных процесса).

mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

этот код используется для проверки того, что стек не взорвался или был CORUPTED, используя канарейки значение, хранящееся в GS + 0x14 см this.

3

ES, FS, GS: Дополнительный сегмент Регистры Может использоваться в качестве дополнительных сегментных регистров; также используется в специальных инструкциях, охватывающих сегменты (например, строковые копии). взято отсюда

http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm


надеюсь, что это помогает

Смежные вопросы