令人困惑的.align地址安排

时间:2017-07-29 11:03:26

标签: assembly dump memory-alignment

我正在查看地址分配。

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: ...

为什么 eoa 的地址始于00010009。它应该从0001000d开始,对吧? 为什么开始0001000c而不是0001000d处理内存?

1 个答案:

答案 0 :(得分:3)

eoa 标签处,.align指令的填充开始
这意味着 eoa 标签本身只跟在结束于00010009h的5字节数组之后。

填充然后插入3个空字节,将 start 标签在0001000Ch处进一步增加3个字节。

  

它应该从“0001000d”开始吧?

我认为你相信.align指令在代码中插入了固定数量的字节(00010005h + 8 = 0001000Dh)。
然而,它所做的是插入计算出的填充字节数,以使以下代码位于对齐的地址。