作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有两个整数和字符变量:
int adad=12345;
char character;
假设我们正在讨论一个平台,其中整数变量的长度大于或等于三个字节,我想访问该整数的第三个字节并将其放入字符变量中,也就是说我会像这样写:
character=*((char *)(&adad)+2);
考虑到那行代码以及我不是编译器或汇编专家的事实,我对汇编中的寻址模式了解一些,我想知道第三个字节的地址 (或者我想最好说第三个字节的偏移量) 会在该行代码本身生成的指令中,或者在一个单独的变量中,该变量的地址(或 offset)在这些说明中?
最佳答案
在这种情况下最好的办法就是尝试一下。这是一个示例程序:
int main(int argc, char **argv)
{
int adad=12345;
volatile char character;
character=*((char *)(&adad)+2);
return 0;
}
我添加了 volatile
以避免分配行被完全优化掉。现在,这是编译器的结果(对于我的 Mac 上的 -Oz
):
_main:
pushq %rbp
movq %rsp,%rbp
movl $0x00003039,0xf8(%rbp)
movb 0xfa(%rbp),%al
movb %al,0xff(%rbp)
xorl %eax,%eax
leave
ret
我们唯一关心的三行是:
movl $0x00003039,0xf8(%rbp)
movb 0xfa(%rbp),%al
movb %al,0xff(%rbp)
movl
是adad
的初始化。然后,如您所见,它读出 adad
的第 3 个字节,并将其存储回内存(volatile
强制存储回内存)。
我想一个很好的问题是,为什么生成什么程序集对您很重要?例如,只需将我的优化标志更改为 -O0
,代码中有趣部分的汇编输出就是:
movl $0x00003039,0xf8(%rbp)
leaq 0xf8(%rbp),%rax
addq $0x02,%rax
movzbl (%rax),%eax
movb %al,0xff(%rbp)
这可以很直接地视为代码的确切逻辑操作:
adad
adad
的地址字符
各种优化会改变输出...如果您出于某种原因确实需要某些特定的行为/寻址模式,您可能必须自己编写程序集。
关于c++ - 编译器在这里生成的汇编代码中的寻址模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3430848/
我正在尝试提供即时转码的视频。不幸的是,这意味着寻求不起作用。我假设这是因为浏览器不知道视频有多长,因此无法正确显示搜索栏。 有谁知道是否可以对视频的时长进行硬编码? 我想到的另一个选择可能是创建我自
我是一名优秀的程序员,十分优秀!