我正在逐步逐步学习汇编内的引导代码。
我找到了以下组件引导代码。但是我仍然有问题要完全理解。
到目前为止,正如我所理解的,
首先,在第1行执行后,
然后转到第2行,
然后转到第5行,
然后转到第6行,加载0x40002001到R1寄存器,
然后转到第7行,分支到R1的寄存器地址(PC已更新为0x40002001(
直到我所理解的。
,但我不了解第3行和第4行的目的和含义。
您能让我知道什么是3和4行具有含义和目的?
1 .section .text
2 .globl main
3 .word 0x40002000
4 .word main+1
5 main:
6 ldr r1, st0
7 bx r1
8 .align 4
9 st0:
10 .word 0x40002001
您需要阅读Cortex-M3的文档。这是来自ARM的网站,不一定是芯片供应商。
简短的答案是在那里描述矢量表,这些不是指示。在那里的参数含义可能会有所不同的。对准,可以确保将常数对齐以避免数据中止的权利。
地址0x00000000处的第一个项目/单词是将重置堆栈指针加载到堆栈指针中的值。第二个单词是重置向量。作为拇指指令设置的机器,这想要在矢量表中设置一个LSBIT的地址。
然后,代码分支为0x40002000,LSBIT被剥离,但BX工作是必要的。(PC获取0x40002000而不是0x40002001(
您没有指定汇编语言(汇编器(,如果要使用GNU汇编器,则可以将其清理一些:
.cpu cortex-m3
.thumb
.globl _start
_start:
.word 0x40002000
.word main
.thumb_func
main:
ldr r1, st0
bx r1
.align
st0:
.word 0x40002001
产生
Disassembly of section .text:
00000000 <_start>:
0: 40002000 andmi r2, r0, r0
4: 00000009 andeq r0, r0, r9
00000008 <main>:
8: 4900 ldr r1, [pc, #0] ; (c <st0>)
a: 4708 bx r1
0000000c <st0>:
c: 40002001 andmi r2, r0, r1
现在的问题是,在重置之前,您如何将程序纳入0x40002000的内存?
您可以在GNU汇编器中执行此技巧。
.cpu cortex-m3
.thumb
.globl _start
_start:
.word 0x40002000
.word main
.thumb_func
main:
ldr r1, =0x40002001
bx r1
Disassembly of section .text:
00000000 <_start>:
0: 40002000 andmi r2, r0, r0
4: 00000009 andeq r0, r0, r9
00000008 <main>:
8: 4900 ldr r1, [pc, #0] ; (c <main+0x4>)
a: 4708 bx r1
c: 40002001 andmi r2, r0, r1
对齐方式是避免出现故障的类似的事情:
.cpu cortex-m3
.thumb
.globl _start
_start:
.word 0x40002000
.word main
.thumb_func
main:
nop
ldr r1, st0
bx r1
.align
st0: .word 0x40002001
。对准导致在不需要的地方添加填充物,因为该值降落在一个位置。
。Disassembly of section .text:
00000000 <_start>:
0: 40002000 andmi r2, r0, r0
4: 00000009 andeq r0, r0, r9
00000008 <main>:
8: 46c0 nop ; (mov r8, r8)
a: 4901 ldr r1, [pc, #4] ; (10 <st0>)
c: 4708 bx r1
e: bf00 nop
00000010 <st0>:
10: 40002001 andmi r2, r0, r1
这也适合您,在这种情况下,与零的垫子不使用对齐,让它将数据放在池中
.cpu cortex-m3
.thumb
.globl _start
_start:
.word 0x40002000
.word main
.thumb_func
main:
nop
ldr r1, =0x40002001
bx r1
它不能很好地拆卸,因此Intel Hex输出表格显示了发生的事情。
:100000000020004009000000C046014908470000E8
:04001000012000408B
:00000001FF
与上面相同,但填充为0x0000
0x4708 (bx r1)
0x0000
0x40002001