繁体   English   中英

了解汇编.long指令

[英]Understanding assembly .long directive

在John Viega撰写的C和C ++安全编程指南中,我遇到了以下声明

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

我不太了解汇编程序中.long指令的用法,但是在这里它用于将预先计算的值嵌入可执行文件中。 我可以以某种方式强制这些字节在可执行文件中的位置吗? 我尝试将其放在main的末尾(认为这种方式将在.text节的末尾),但是出现了段错误。 将其放在主要作品之外。

即使在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中的最后一个段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM