Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何使用";解释程序集引导代码;。字;_Assembly_Arm_Cortex M3_Thumb - Fatal编程技术网

Assembly 如何使用";解释程序集引导代码;。字;

Assembly 如何使用";解释程序集引导代码;。字;,assembly,arm,cortex-m3,thumb,Assembly,Arm,Cortex M3,Thumb,我正在慢慢地一步一步地研究汇编中的引导代码 我找到了下面的程序集启动代码。但我仍然有问题要完全理解 据我所知,到目前为止 首先,在执行第1行之后 然后去2号线 然后去5号线 然后转到第6行,将0x40002001加载到r1寄存器 然后转到第7行,分支到r1的寄存器地址(PC更新为0x40002001) 直到这里我才明白 但我不明白第三行和第四行的目的和意义 请告诉我第3行和第4行有什么意义和目的 1 .section .text

我正在慢慢地一步一步地研究汇编中的引导代码

我找到了下面的程序集启动代码。但我仍然有问题要完全理解

据我所知,到目前为止

首先,在执行第1行之后

然后去2号线

然后去5号线

然后转到第6行,将0x40002001加载到r1寄存器

然后转到第7行,分支到r1的寄存器地址(PC更新为0x40002001)

直到这里我才明白

但我不明白第三行和第四行的目的和意义

请告诉我第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的网站,不一定是芯片供应商

简短的回答是。有词来描述向量表,这些不是说明。参数含义可能不同的.align用于确保常量正确对齐,以避免数据中止

地址0x00000000处的第一个项/字是重置时加载到堆栈指针中的值。第二个字是重置向量。作为一台thumb指令集机器,它希望在向量表中设置lsbit地址

然后代码分支到0x40002000。lsbit被剥离,但bx工作所必需。(PC获取0x40002000而不是0x40002001)

您没有指定汇编语言(assembler),如果这将使用gnu assembler,那么您可以对其进行一些清理:

.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
.align导致在其上方不需要添加填充的位置添加填充,因为值落在其对齐的位置

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
它不能很好地反汇编,因此intel十六进制输出表单显示了发生的情况

:100000000020004009000000C046014908470000E8
:04001000012000408B
:00000001FF
同上,但填充为0x0000

0x4708 (bx r1)
0x0000
0x40002001

您不应该认为第1、2和5行正在执行。这里唯一的可执行指令是第6行和第7行。
.cpu cortex-m3
.thumb

    .globl _start
_start:
    .word   0x40002000
    .word   main

    .thumb_func
main:
     nop
     ldr   r1, =0x40002001
     bx    r1
:100000000020004009000000C046014908470000E8
:04001000012000408B
:00000001FF
0x4708 (bx r1)
0x0000
0x40002001