我将准确列出我不理解的内容,并向您展示我无法理解的部分。
首先,
.Align指令
1.~? :暗示“ 导致生成的下一个数据以模整数字节对齐?” 我可以推测下一个生成的数据是内存到寄存器的传输,没有? Modulo意味着分裂的其余部分。我不明白“ 要对齐模数整数字节 ”.......
简单数据声明的剩余部分是什么,以及如何通过余数对齐生成的下一个数据是否有用?如果下一个数据以模数对齐,那就说下一个生成的数据,无论这意味着什么,是整数的余数?这完全没有意义。
对于从C .align 8
编译的数据字节,在x86中发出的char
指令,具体是什么。char CHARACTER = 0;
是什么?或者直接用该指令编码,而不是编译C后的初步汇编代码?我在Assembly中进行了调试,发现任何C / C ++数据声明,如chars
,ints
,floats
等,都会将指令.align 8
插入到每个声明中,并添加其他指令,例如.bss
,.zero
,.globl
,.text
,.Letext0
,.Ltext0
。
所有这些指令是什么,或者至少是我的主要要求?我已经学习了很多主要的x86汇编指令,但从未被引入或指向所有这些奇怪的指令。它们如何影响操作码,并且都是必要的?
答案 0 :(得分:5)
如评论中所述,这意味着编译器将添加足够的填充字节,以便下一个数据落在“偶数”位置(可被对齐值整除)。这很重要,因为对齐的内存访问比未对齐的内存访问快得多。 (从0x10000加载双字比从0x10001加载双字更好)。如果您与其他组件连接并且需要使用给定的填充/对齐来发送/接收数据结构,这可能也很有用。
答案 1 :(得分:2)
首先,请注意.align
它不是x86特定的概念,而是 GAS 指令记录here。它也可以用于其他架构。 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
,这是4
之后5
的第一个倍数。
答案 2 :(得分:1)
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.)
答案 3 :(得分:0)
模数是指算术中的模运算,即c中的%
符号,换句话说就是“余数”。
“modulo n”通常意味着n
表达式的模数等于0.如果要放置地址“modulo 4”,则表示(地址%4)== 0,这是对于以下示例,则为true:0,4,8,0xC,0x10等
硬件限制要求某些数据类型通过大整数对齐。例如,某些DMA引擎可能需要模64。