当前位置: 首页 > 工具软件 > eax > 使用案例 >

汇编 movl %gs:20, %eax 的作用

农诚
2023-12-01

将如下代码进行编译,输出的汇编版本为

int main()
{
    int a[2][3]= {{1,2,3},{4,5,6}};
    return 0;
}
	pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $36, %esp
    movl    %gs:20, %eax
    movl    %eax, -12(%ebp)
    xorl    %eax, %eax
    movl    $1, -36(%ebp)
    movl    $2, -32(%ebp)
    movl    $3, -28(%ebp)
    movl    $4, -24(%ebp)
    movl    $5, -20(%ebp)
    movl    $6, -16(%ebp)
    movl    $0, %eax
    movl    -12(%ebp), %edx
    xorl    %gs:20, %edx
    je  .L3 
    call    __stack_chk_fail

其中如下两行的作用是将 %gs:20 的值放在数组结束处,并在结束的时候判断这个值有没有被改变,从而判断堆栈是否损坏。这种叫做Stack canaries, 堆栈金丝雀

movl    %gs:20, %eax
xorl    %gs:20, %edx

gcc 默认情况下是开启堆栈检查,即 gcc -fstack-protector=strong
可以通过 gcc -fno-stack-protector关闭检查。

另,gs 一般 用来存放线程局部变量,比如 errno

参考:

 类似资料: