我会准确地列出我不明白的部分,并向你展示我无法理解的部分。
首先,
.Align指令
1.~?:“导致生成的下一个数据对齐模整数字节”意味着什么?我可以推测下一个生成的数据是内存到寄存器的传输,不是吗?模指的是除法的其余部分。我不理解“是对齐模整数字节”.
什么是简单数据声明的剩余部分,以及由余数对齐生成的下一个数据如何有用?如果下一个数据是对齐模块化的,也就是说下一个生成的数据,不管这意味着什么,都是整数的剩余部分吗?这完全没有意义。
对于从C .align编译的数据字节(即char CHARACTER = 0;
),.align 8
指令在x86中具体用于什么?或者是直接用该指令编写的代码,而不是编译C之后的初步汇编代码?我在程序集中进行了调试,并注意到任何C/C++数据声明,如chars
、ints
、floats
等,都将向每个声明中插入指令.align 8
,并添加其他指令,如.bss
、.zero
、.globl
、.text
、.Letext0
、.Ltext0
。
所有这些指令是为了什么,或者至少是我的主要问题?我已经学习了许多主要的x86程序集指令,但从未被引入或指向所有这些奇怪的指令。它们是如何影响操作码的,它们是否都是必要的?
发布于 2013-06-25 19:54:20
正如注释中提到的,这意味着编译器将添加足够多的填充字节,以便下一个数据位于“偶数”位置(可被对齐值整除)。这一点很重要,因为对齐内存访问要比未对齐内存访问快得多。(从0x10000加载双字比从0x10001加载双字要好)。如果您正在与其他组件进行接口,并且需要使用给定的填充/对齐方式发送/接收数据结构,则它也可能很有用。
发布于 2015-11-07 21:07:53
首先,请注意,.align
--这不是x86特有的概念,而是GAS指令记录了这里。它也可以用于其他架构。x86不指定指令,只指定指令。
现在让我们玩它来理解它:
a.S
.byte 1
.align 16
sym: .byte 2
编译和解压缩:
as -o a.o a.S
objdump -Sd a.o
输出:
0000000000000000 <a-0x10>:
0: 01 0f add %ecx,(%rdi)
2: 1f (bad)
3: 44 00 00 add %r8b,(%rax)
6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
d: 00 00 00
0000000000000010 <sym>:
10: 02 .byte 0x2
因此,sym
被移动到字节16,在我们放置的第一个.byte 1
之后的第一个16的倍数,将它对齐为16个字节。
用于填充01
和02
之间的字节是由GAS选择的垃圾(TODO?)
不让我们尝试不同的输入:
.skip 5
.align 4
sym: .byte 2
给予:
0000000000000000 <sym-0x8>:
0: 00 00 add %al,(%rax)
2: 00 00 add %al,(%rax)
4: 00 0f add %cl,(%rdi)
6: 1f (bad)
...
0000000000000008 <sym>:
8: 02 .byte 0x2
因此,这次sym
被移到了8
,这是继5
之后的第一个4
倍数。
发布于 2013-06-26 09:52:56
align
指令的主要原因是加速执行。如果call
或jmp
目标位于奇数地址,则可能需要额外的总线传输和/或前进到确切的字节。数据也是如此。在旧的80386手册中,当目标不对齐时,会对某些操作码进行惩罚。
我在第24页的手册(来自http://css.csail.mit.edu/6.858/2011/readings/i386.pdf)中找到了它:
Such misaligned data transfers reduce performance by requiring extra memory
cycles. For maximum performance, data structures (including stacks) should
be designed in such a way that, whenever possible, word operands are aligned
at even addresses and doubleword operands are aligned at addresses evenly
divisible by four. Due to instruction prefetching and queuing within the
CPU, there is no requirement for instructions to be aligned on word or
doubleword boundaries. (However, a slight increase in speed results if the
target addresses of control transfers are evenly divisible by four.)
https://stackoverflow.com/questions/17306250
复制相似问题