“ .align” x86汇编程序指令的作用是什么?

问题描述 投票:6回答:4

我将确切列出我不了解的内容,并向您展示我也不了解的部分。

首先,

。Align指令

  1. 。align整数,填充。.align伪指令使生成的下一个数据以模整数字节的形式对齐]

1.〜? :“ 将生成的下一个数据对齐为整数整数字节?”的含义是什么?我可以推测生成的下一个数据是从内存到寄存器的传输,不是吗?模数将暗示除法的其余部分。我不明白“ 要对整数整数字节进行对齐” .......

什么是简单数据声明的余数?如何将生成的下一个数据与余数对齐?如果下一个数据以模进行对齐,也就是说,下一个生成的数据(确切地说是整数)是整数的余数吗?那绝对没有道理。

[x86中针对从C .align 8,即char编译的数据字节发出的.align,例如,char CHARACTER = 0;指令的具体含义是什么?还是直接用该指令直接编码,而不是编译C之后的初步汇编代码?我已在Assembly中进行调试,并注意到任何C / C ++数据声明,例如charsintsfloats等,都会向其中每个插入指令.align 8,并添加其他指令,例如.bss.zero.globl.text.Letext0.Ltext0

这些指令全部用于什么,或者至少是我的主要要求?我已经学到了很多主要的x86 Assembly指令,但是从未介绍过或指向所有这些奇怪的指令。它们如何影响操作码,并且都是必需的吗?

assembly x86 gas
4个回答
6
投票

如评论中所述,这意味着编译器将添加足够的填充字节,以便下一个数据降落在“偶数”位置(可被对齐值整除)。这很重要,因为对齐的内存访问比未对齐的内存访问快得多。 (从0x10000加载双字比从0x10001加载双字更好)。如果您要与其他组件连接并且需要使用给定的填充/对齐方式发送/接收数据结构,它也可能很有用。


5
投票

[首先,请注意.align它不是x86特定概念,而是记录在here中的GNU 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个字节。

[用于填充0102之间的字节是由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,这是4之后的5的第一个倍数。


2
投票

align指令的主要原因是加快执行速度。如果calljmp目标位于奇数地址,则可能需要额外的总线传输和/或提前到精确字节。数据也一样。在旧的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.)

0
投票

模是指算术中的模运算,即c中的%符号,或换句话说是“余数”。

“ modulo n”通常意味着n的表达式的模数等于0。如果要放置地址“ modulo 4”,则意味着(地址%4)== 0,对于以下示例:0、4、8、0xC,0x10等

硬件限制要求某些数据类型必须由大整数对齐。例如,某些DMA引擎可能需要模64。

© www.soinside.com 2019 - 2024. All rights reserved.