概述
将如下代码进行编译,输出的汇编版本为
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 的作用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复