8

我将准确列出我不明白的内容,并将我无法理解的部分也显示给您。

首先,

.Align 指令

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

1.~? :“导致生成的下一个数据以模整数字节对齐”意味着什么? 我可以推测生成的下一个数据是内存到寄存器的传输,不是吗?模将意味着除法的其余部分。我不明白“要对齐模整数字节”.......

简单数据声明的剩余部分是什么,由剩余部分对齐生成的下一个数据将如何有用?如果下一个数据是模对齐的,也就是说下一个生成的数据,无论这意味着什么,是整数的余数吗?这完全没有意义。

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

所有这些指令的目的是什么,或者至少是我的主要要求?我学习了很多主要的 x86 汇编指令,但从未被介绍或指出所有这些奇怪的指令。它们如何影响操作码,它们都是必需的吗?

4

4 回答 4

7

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

于 2013-06-25T19:54:20.813 回答
7

首先,请注意.align它不是 x86 特定的概念,而是此处记录的 GNU GAS 指令。它也可以用于其他架构。x86 没有指定指令,只有指令。

现在让我们玩弄它来理解它:

作为

.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

所以被移动到第 16 个字节,即我们放置sym的第一个 16 的第一个倍数,以将其对齐为 16 个字节。.byte 1

用于填充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,也就是第一个倍数之后的4那个5

于 2015-11-07T21:07:53.797 回答
3

该指令的主要原因align是加快执行速度。如果 a callorjmp目标位于奇数地址,则可能需要额外的总线传输和/或提前到确切的字节。数据也是如此。在旧的 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.)
于 2013-06-26T09:52:56.117 回答
0

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

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

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

于 2013-06-25T19:59:31.743 回答