首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用".word“解释程序集引导代码

如何使用".word“解释程序集引导代码
EN

Stack Overflow用户
提问于 2018-02-19 09:35:05
回答 1查看 854关注 0票数 1

我正在慢慢地一步一步地学习汇编语言中的引导代码。

我找到了下面的汇编引导代码。但我仍然有问题要完全理解。

到目前为止,据我所知

首先,在执行完第一行之后,

然后转到第2行,

然后转到第5行,

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

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

直到现在我才明白。

但是我不能理解第三行和第四行的目的和意义。

你能告诉我第三行和第四行有什么含义和用途吗?

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-19 14:22:35

您需要阅读cortex-m3的文档。这是来自ARM的网站,不一定是芯片供应商。

简而言之,.words是用来描述向量表的,而不是指令。.align的参数含义可能不同,它的作用是确保常量正确对齐,以避免数据中止。

地址0x00000000处的第一个项目/字是复位时加载到堆栈指针中的值。第二个单词是重置向量。作为一个thumb指令集机器,它想要有一个在向量表中设置了lsbit的地址。

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

你没有指定汇编语言(汇编语言),如果要使用gnu汇编语言,那么你可以清理一下:

代码语言:javascript
复制
.cpu cortex-m3
.thumb

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

    .thumb_func
main:
     ldr   r1, st0
     bx    r1

    .align
st0:
    .word   0x40002001

生产

代码语言:javascript
复制
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汇编程序中使用此技巧来避免.align混淆或可能的浪费(在.align之后使用错误的值)。

代码语言:javascript
复制
.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

对齐是为了避免这样的事情导致错误:

代码语言:javascript
复制
.cpu cortex-m3
.thumb

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

    .thumb_func
main:
     nop
     ldr   r1, st0
     bx    r1

.align
st0: .word 0x40002001

.align导致在上面不需要添加填充的地方添加填充,因为值到达了它对齐的位置。

代码语言:javascript
复制
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

这也对你来说是对齐的,在这种情况下用零填充,不使用对齐,让它将数据放在池中

代码语言:javascript
复制
.cpu cortex-m3
.thumb

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

    .thumb_func
main:
     nop
     ldr   r1, =0x40002001
     bx    r1

它不能很好地反汇编,所以英特尔十六进制输出表单显示了发生了什么。

代码语言:javascript
复制
:100000000020004009000000C046014908470000E8
:04001000012000408B
:00000001FF

同上,但填充为0x0000

代码语言:javascript
复制
0x4708 (bx r1)
0x0000
0x40002001
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48858507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档