- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读到,double
变量(8 字节)必须是 8 字节对齐。
现在,如果我正在为程序编写整个代码,那么我可以使 double
变量按 8 字节对齐,不会出现任何问题。
但假设我有以下场景:我创建一个函数,在堆栈上创建一个 double 变量,然后我将此函数交给其他人在他的程序中使用它。现在,当我的函数被调用时,我的函数将不知道 double
变量是否将在可被 8 整除的地址上创建!
这个问题可以解决吗(请注意,我不关心由于不对齐我的 double
变量而导致的可忽略的性能损失,但我只是想知道是否有解决这个问题的方法) ?
最佳答案
在函数内部,您可以通过将 esp
的三个最低有效位设置为零来强制堆栈为 8 字节对齐。这可以通过 and
指令来实现:
andl $0xfffffff8, %esp
生成的 esp
将等于(即:esp
已对齐)或低于前一个。由于 x86 架构上的堆栈向下增长,这会导致在堆栈上分配大小在 0-7 字节之间的填充。
请注意,如果 esp
在执行 and
指令之前已经是 8 字节对齐(即:它的三个最低有效位已经为零),则根本不需要填充(即:在堆栈上创建 0 字节 的填充。
如果使用常用函数prologue和epilogue,退出函数时,将恢复之前保存的esp
值:
myFunction:
//prologue: save the current stack frame
pushl %ebp
movl %esp, %ebp
andl $0xfffffff8, %esp
//stack now 8-byte aligned
//...
leave //restore the previous stack frame
ret
这样,之前分配的填充现在将从堆栈中释放。
关于assembly - 对双变量的数据对齐感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45811549/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!