2017-07-29 127 views
3

我正在查看地址分配。代码令人困惑的.align地址排列

00010004 <arr>: 10004: 10080402 .word 0x10080402 10008: 20 .byte 0x20 
00010009 <eoa>: 10009: 00 .byte 0x00 ... 
0001000c <start>: ... 

大会部分:

.section .text.ResetISR 
.align 
.global ResetISR 
.type ResetISR, %function 

ResetISR: 
    b start 

arr: 
    .byte 2, 4, 8, 16, 32 

eoa: 
    .align 

start: ... 

为什么在00010009做的EOA起始地址。它应该从0001000d开始,对吧?
为什么开始0001000c寻址内存而不是从0001000d

回答

3

EOA标签将由.align指令填充开始
这意味着eoa标签本身简单地遵循以00010009h结束的5字节数组。

填充然后插入3空字节,将开始标签3个字节进一步在0001000Ch。


应该从 “0001000d” 首发权?

我想你认为.align指令在代码(00010005h + 8 = 0001000Dh)中插入了固定数量的字节。
但是它所做的是将填充字节的计算数量以使代码处的处于对齐的地址。

+0

直指点! :) –