令人困惑的 .align 地址排列
Confusing .align address arrangement
我正在查看地址分配。
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
开始,对吧?
为什么 start 从 0001000c
而不是从 0001000d
寻址内存?
在 eoa 标签处将通过 .align
指令 start.
进行填充
这意味着 eoa 标签本身只是跟在以 00010009h 结束的 5 字节数组之后。
填充然后插入 3 个空字节,将 start 标签在 0001000Ch 处进一步放置 3 个字节。
It should be starting from "0001000d" right?
我认为您认为 .align
指令在代码中插入了固定数量的字节 (00010005h + 8 = 0001000Dh)。
然而,它所做的是插入计算出的填充字节数,使以下代码位于对齐地址。
我正在查看地址分配。
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
开始,对吧?
为什么 start 从 0001000c
而不是从 0001000d
寻址内存?
在 eoa 标签处将通过 .align
指令 start.
进行填充
这意味着 eoa 标签本身只是跟在以 00010009h 结束的 5 字节数组之后。
填充然后插入 3 个空字节,将 start 标签在 0001000Ch 处进一步放置 3 个字节。
It should be starting from "0001000d" right?
我认为您认为 .align
指令在代码中插入了固定数量的字节 (00010005h + 8 = 0001000Dh)。
然而,它所做的是插入计算出的填充字节数,使以下代码位于对齐地址。