当我反汇编一个函数时,我不时会遇到形式为 的表达式%reg:value
。通常,当我在 GCC ( -fstack-protector
) 中激活金丝雀时,我会遇到这种语法,如下例所示:
(gdb) disas
Dump of assembler code for function foo:
0x000000000040057c <+0>: push %rbp
0x000000000040057d <+1>: mov %rsp,%rbp
0x0000000000400580 <+4>: sub $0x20,%rsp
0x0000000000400584 <+8>: mov %edi,-0x14(%rbp)
=> 0x0000000000400587 <+11>: mov %fs:0x28,%rax
0x0000000000400590 <+20>: mov %rax,-0x8(%rbp)
0x0000000000400594 <+24>: xor %eax,%eax
0x0000000000400596 <+26>: mov $0x4006ac,%edi
0x000000000040059b <+31>: callq 0x400440 <puts@plt>
0x00000000004005a0 <+36>: mov -0x8(%rbp),%rax
0x00000000004005a4 <+40>: xor %fs:0x28,%rax
0x00000000004005ad <+49>: je 0x4005b4 <foo+56>
0x00000000004005af <+51>: callq 0x400450 <__stack_chk_fail@plt>
0x00000000004005b4 <+56>: leaveq
0x00000000004005b5 <+57>: retq
这种语法的含义是什么?