![](/img/trans.png)
[英]Understanding assembly code when converting from unsigned char to long 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.