了解程序集.long指令

时间:2015-12-07 08:52:16

标签: c assembly

在John Viega的C和C ++安全编程手册中,我遇到了以下声明

asm("value_stored:    \n"
    ".long 0xFFFFFFFF \n"
);

我真的不明白在汇编中使用.long指令,但在这里它用于在可执行文件中嵌入一个预先计算的值。我可以以某种方式强制这些字节在可执行文件中的位置吗?我试图把它放在main的末尾(认为这种方式将在.text部分的末尾),但我得到了分段错误。把它放在主要作品之外。

1 个答案:

答案 0 :(得分:3)

即使在main的末尾,内联汇编程序序列也会生成要执行的代码。在我的环境中objdump -d foo.o显示:

00000000004004b4 <main>:
  4004b4:   55                      push   %rbp
  4004b5:   48 89 e5                mov    %rsp,%rbp

00000000004004b8 <value>:
  4004b8:   ff                      (bad)  
  4004b9:   ff                      (bad)  
  4004ba:   ff                      (bad)  
  4004bb:   ff                      (bad)  
  4004bc:   b8 01 00 00 00          mov    $0x1,%eax
  4004c1:   5d                      pop    %rbp
  4004c2:   c3                      retq   

跳过它可以减轻这种情况

asm("jmp 1f"
    "value: .long 0xffffffff"
    "1:");

关键字Nf或Nb创建本地临时标签以向前或向后跳跃。

另一个选项是将变量放到命名段中,该段可以在链接器文件中作为.text或.data中的最后一个段进行排序。

相关问题