我是靠谱客的博主 糊涂手机,最近开发中收集的这篇文章主要介绍汇编 movl %gs:20, %eax 的作用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

参考:

  • What is %gs in Assembly
  • what does this instruction do?:- mov %gs:0x14,%eax

最后

以上就是糊涂手机为你收集整理的汇编 movl %gs:20, %eax 的作用的全部内容,希望文章能够帮你解决汇编 movl %gs:20, %eax 的作用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部