首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >".align“x86汇编程序指令到底做了什么?

".align“x86汇编程序指令到底做了什么?
EN

Stack Overflow用户
提问于 2013-06-25 19:42:36
回答 4查看 16.5K关注 0票数 10

我会准确地列出我不明白的部分,并向你展示我无法理解的部分。

首先,

.Align指令

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

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

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

对于从C .align编译的数据字节(即char CHARACTER = 0; ),.align 8指令在x86中具体用于什么?或者是直接用该指令编写的代码,而不是编译C之后的初步汇编代码?我在程序集中进行了调试,并注意到任何C/C++数据声明,如charsintsfloats等,都将向每个声明中插入指令.align 8,并添加其他指令,如.bss.zero.globl.text.Letext0.Ltext0

所有这些指令是为了什么,或者至少是我的主要问题?我已经学习了许多主要的x86程序集指令,但从未被引入或指向所有这些奇怪的指令。它们是如何影响操作码的,它们是否都是必要的?

EN

回答 4

Stack Overflow用户

发布于 2013-06-25 19:54:20

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

票数 8
EN

Stack Overflow用户

发布于 2015-11-07 21:07:53

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

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

a.S

代码语言:javascript
运行
复制
.byte 1
.align 16
sym: .byte 2

编译和解压缩:

代码语言:javascript
运行
复制
as -o a.o a.S
objdump -Sd a.o

输出:

代码语言:javascript
运行
复制
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?)

不让我们尝试不同的输入:

代码语言:javascript
运行
复制
.skip 5
.align 4
sym: .byte 2

给予:

代码语言:javascript
运行
复制
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倍数。

票数 7
EN

Stack Overflow用户

发布于 2013-06-26 09:52:56

align指令的主要原因是加速执行。如果calljmp目标位于奇数地址,则可能需要额外的总线传输和/或前进到确切的字节。数据也是如此。在旧的80386手册中,当目标不对齐时,会对某些操作码进行惩罚。

我在第24页的手册(来自http://css.csail.mit.edu/6.858/2011/readings/i386.pdf‎)中找到了它:

代码语言:javascript
运行
复制
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.)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17306250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档