Что такое% gs в Assembly

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

Ответ 1

GS - это сегментный регистр, его использование в linux может быть прочитано на здесь (в основном используется для каждого процесса).

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

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

Ответ 2

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

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


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