Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc .p2align在asm代码中起什么作用?_Gcc_Assembly - Fatal编程技术网

Gcc .p2align在asm代码中起什么作用?

Gcc .p2align在asm代码中起什么作用?,gcc,assembly,Gcc,Assembly,我有一个名为.p2align的汇编指令,它是由gcc从C程序源代码生成的 据我所知,对齐的访问比未对齐的快,而且asm程序不会自动对齐内存位置或优化内存访问,因此您必须这样做 我真的看不懂这个.p2align 4,15,尤其是最后一部分,即15 忽略了一个事实,即显然,gcc生成了2个,,而不是许多文档所报告的1个;我得到的是这段asm以这样一种方式排列内存,每个位置占用2^4位,这意味着16位,因此我认为公平地说,在这种情况下,一个字的长度是16位 那么15可能意味着什么?这是一个什么数字?计

我有一个名为
.p2align
的汇编指令,它是由
gcc
从C程序源代码生成的

据我所知,对齐的访问比未对齐的快,而且
asm
程序不会自动对齐内存位置或优化内存访问,因此您必须这样做

我真的看不懂这个
.p2align 4,15
,尤其是最后一部分,即
15

忽略了一个事实,即显然,
gcc
生成了2个
,而不是许多文档所报告的1个;我得到的是这段
asm
以这样一种方式排列内存,每个位置占用2^4位,这意味着16位,因此我认为公平地说,在这种情况下,一个
字的长度是16位

那么
15
可能意味着什么?这是一个什么数字?计数是否从
0
开始,“实际”数量是16而不是15

编辑:


我刚刚将同一个C源代码转换为32位和64位asm代码,内存始终以相同的方式与相同的指令对齐
.p2align 4,15
。这是为什么?

记录了
.p2align
指令

第一个表达式是所需的双字节对齐能力
.p2align 4
在16字节边界上填充对齐
.p2align 5
-32字节边界等

第二个表达式是用作填充的值。对于x86,最好不考虑这个问题,由汇编程序选择,因为有一系列指令是有效的。在一些对齐指令中,您将看到
0x90
,这是
NOP
指令


最后一个表达式是用于填充的最大字节数-如果对齐需要更多字节,请跳过该指令。在本例中-
4,15
-它不起任何作用,因为
15
是产生16字节对齐所需的最大字节数。

指令名称的p2部分来自gas,可能是英特尔p-II CPU提供循环体代码条件对齐建议的原始实现。正如Agner Fog所解释的,最初的目的是确保第一个指令获取获得足够的代码来开始解码

还有一个与循环流检测器的交互,如果在循环的顶部和底部使用了额外的指令缓存线片段,那么循环流检测器可能无法启动。对齐是有条件的,以避免消耗超过必要的内存,并避免在执行填充字节的情况下需要过多的时间。 gcc根据mtune目标设置做出不同的对齐选择

有些目标设置了2个对齐指令,例如,进行无条件8字节对齐和有条件32字节对齐。 选择各种nop模式的原因是,在执行填充流(当执行从上面进入循环时)的情况下,最小化所花费的时间。例如,将寄存器复制到自身的带前缀的指令可以比单字节NOP更快地消耗代码字节。这与本主题中最初提到的情况没有区别。
因此,部分混淆可能来自此对齐指令,该指令具有与设置数据对齐无关的功能,尽管该指令也用于此目的。

这更奇怪,因此对于32位和64位模式,我都得到了基于128位内存块的对齐?这也意味着在128位中,所有的东西都可以不对齐?我用什么逻辑来选择正确的路线?我现在理解了这个指令的含义,我不明白为什么它在32位机器上是128位还是64位。@user2485710-忘记位。字节对齐很重要。虽然x86不需要对齐代码,但它提高了循环、数据访问等性能(这是一个复杂的主题)。此外,功能预计将从链接器要求的特定对齐开始。我可以在哪里以及在什么样的文档中获得更多信息?我真的不明白这里发生了什么…@user2485710-AMD/Intel为开发者提供资源。Agner Fog的非常好。您也可以编译简单的函数,自己完成程序集的工作。我今天遇到了一个.p2align 4,,10的例子,其中填充限制需要增加1,以避免性能降低30%。我想知道gcc有哪些选项可以改变填充限制。