如何使用".word"解释程序集启动代码



我正在逐步逐步学习汇编内的引导代码。

我找到了以下组件引导代码。但是我仍然有问题要完全理解。

到目前为止,正如我所理解的,

首先,在第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

最新更新