我正在慢慢地一步一步地学习汇编中的 Boot 代码。我找到了下面的程序集 Boot 代码。但我还是无法完全理解。据我所知首先,在第1行执行之后,然后转到第2行,然后转到第5行,然后转到第6行,将0x40002001加载到R1寄存器,然后转到第7行,分支到r1的寄存器地址(PC更新为0x40002001)直到这里我才明白。但是我不明白第3行和第4行的目的和意义。你能告诉我第3行和第4行有什么意义和目的吗?
sqyvllje1#
你需要阅读cortex-m3的文档。这是来自ARM的网站,不一定是芯片厂商.简短的回答是。单词是用来描述向量表的,这些不是指令。.align参数的含义可以变化,它用于确保常量正确对齐,以避免数据中止。地址0x 00000000处的第一项/字是在复位时加载到堆栈指针中的值。第二个字是复位向量。作为一个thumb指令集机器,它希望在向量表中设置一个lsbit地址。然后代码分支到0x 40002000,lsbit被剥离,但这是bx工作所必需的。(PC获得0x 40002000而不是0x 40002001)你没有指定汇编语言(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
型现在的问题是,在重置之前,如何将程序放入0x 40002000的内存中?您可以在GNU汇编器中使用这个技巧来解决.align混淆或可能的浪费(在.align之后使用错误的值)
.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
型.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
型这也为您对齐,在这种情况下填充零,没有使用对齐,让它将数据放入池中
.cpu cortex-m3 .thumb .globl _start _start: .word 0x40002000 .word main .thumb_func main: nop ldr r1, =0x40002001 bx r1
型它没有很好地分解,所以英特尔十六进制输出形式显示发生了什么。
:100000000020004009000000C046014908470000E8 :04001000012000408B :00000001FF
型与上面相同,但填充为0x 0000
0x4708 (bx r1) 0x0000 0x40002001
型
1条答案
按热度按时间sqyvllje1#
你需要阅读cortex-m3的文档。这是来自ARM的网站,不一定是芯片厂商.
简短的回答是。单词是用来描述向量表的,这些不是指令。.align参数的含义可以变化,它用于确保常量正确对齐,以避免数据中止。
地址0x 00000000处的第一项/字是在复位时加载到堆栈指针中的值。第二个字是复位向量。作为一个thumb指令集机器,它希望在向量表中设置一个lsbit地址。
然后代码分支到0x 40002000,lsbit被剥离,但这是bx工作所必需的。(PC获得0x 40002000而不是0x 40002001)
你没有指定汇编语言(assembler),如果这是要使用gnu assembler那么你可以清理一下:
字符串
生产
型
现在的问题是,在重置之前,如何将程序放入0x 40002000的内存中?
您可以在GNU汇编器中使用这个技巧来解决.align混淆或可能的浪费(在.align之后使用错误的值)
型
对齐是为了避免这样的事情导致错误:
型
.align导致在不需要的地方添加了填充,因为值落在了它对齐的地方。
型
这也为您对齐,在这种情况下填充零,没有使用对齐,让它将数据放入池中
型
它没有很好地分解,所以英特尔十六进制输出形式显示发生了什么。
型
与上面相同,但填充为0x 0000
型