Assembly 没有宏类型,臂部件无法工作
我正在学习一些用于STM32F0 ARM Cortex M0微控制器的ARMv6-M汇编程序。首先,我编写了一个脚本,其中我将寄存器r0初始化为0,r1初始化为1,最后,在循环中r0递增1。使用调试器,即gdb,我可以使用si运行一个步骤,使用info reg输出寄存器。下面给出了汇编程序代码Assembly 没有宏类型,臂部件无法工作,assembly,arm,stm32,Assembly,Arm,Stm32,我正在学习一些用于STM32F0 ARM Cortex M0微控制器的ARMv6-M汇编程序。首先,我编写了一个脚本,其中我将寄存器r0初始化为0,r1初始化为1,最后,在循环中r0递增1。使用调试器,即gdb,我可以使用si运行一个步骤,使用info reg输出寄存器。下面给出了汇编程序代码 .syntax unified .cpu cortex-m0 .fpu softvfp .thumb .global vector_table .global reset_handler .type
.syntax unified
.cpu cortex-m0
.fpu softvfp
.thumb
.global vector_table
.global reset_handler
.type vector_table, %object
vector_table:
.word _estack
.word reset_handler
.type reset_handler, %function
reset_handler:
LDR r0, =0
LDR r1, =1
main_loop:
ADDS r0, r0, 1
B main_loop
并且是基于
当我删除.type x宏时,通过我的调试器,我看不到寄存器中有任何更改,但是根据.type宏,应该没有任何影响
为什么删除.type宏时寄存器r0和r1保持不变
使用.type函数
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4800 ldr r0, [pc, #0] ; (100c <reset_handler+0x4>)
100a: 4901 ldr r1, [pc, #4] ; (1010 <reset_handler+0x8>)
100c: 00000000 andeq r0, r0, r0
1010: 00000001 andeq r0, r0, r1
如果你再次表现出色,二进制代码将起作用:
so.elf: file format elf32-littlearm
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4800 ldr r0, [pc, #0] ; (100c <reset_handler+0x4>)
100a: 4901 ldr r1, [pc, #4] ; (1010 <reset_handler+0x8>)
100c: 00000000 andeq r0, r0, r0
1010: 00000001 andeq r0, r0, r1
给予
给出非函数代码
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4802 ldr r0, [pc, #8] ; (1014 <hello+0x4>)
100a: 4903 ldr r1, [pc, #12] ; (1018 <hello+0x8>)
100c: f000 f800 bl 1010 <hello>
00001010 <hello>:
1010: ea000002 b 1020 <__reset_handler_from_arm>
1014: 00000000 andeq r0, r0, r0
1018: 00000001 andeq r0, r0, r1
101c: 00000000 andeq r0, r0, r0
00001020 <__reset_handler_from_arm>:
1020: e59fc000 ldr r12, [pc] ; 1028 <__reset_handler_from_arm+0x8>
1024: e12fff1c bx r12
1028: 00001009 andeq r1, r0, r9
102c: 00000000 andeq r0, r0, r0
现在在cortex-m上没有arm模式,因此没有互通,但是对于向量表和汇编语言中的任何其他函数,您希望从C或其他高级调用,您需要有函数声明
我从未见过的对象声明,自从添加arm以来一直在使用gnu工具,并且一直在不需要它的情况下进行裸机引导芯片的工作…所以在这方面我帮不了你
它们保持不变的原因是因为您挂起了芯片或将其强制放入了一个您没有定义的处理程序中,所以再次挂起了芯片。处理器状态应已更改,以指示您所处的故障模式
使用.type函数
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4800 ldr r0, [pc, #0] ; (100c <reset_handler+0x4>)
100a: 4901 ldr r1, [pc, #4] ; (1010 <reset_handler+0x8>)
100c: 00000000 andeq r0, r0, r0
1010: 00000001 andeq r0, r0, r1
如果你再次表现出色,二进制代码将起作用:
so.elf: file format elf32-littlearm
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4800 ldr r0, [pc, #0] ; (100c <reset_handler+0x4>)
100a: 4901 ldr r1, [pc, #4] ; (1010 <reset_handler+0x8>)
100c: 00000000 andeq r0, r0, r0
1010: 00000001 andeq r0, r0, r1
给予
给出非函数代码
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4802 ldr r0, [pc, #8] ; (1014 <hello+0x4>)
100a: 4903 ldr r1, [pc, #12] ; (1018 <hello+0x8>)
100c: f000 f800 bl 1010 <hello>
00001010 <hello>:
1010: ea000002 b 1020 <__reset_handler_from_arm>
1014: 00000000 andeq r0, r0, r0
1018: 00000001 andeq r0, r0, r1
101c: 00000000 andeq r0, r0, r0
00001020 <__reset_handler_from_arm>:
1020: e59fc000 ldr r12, [pc] ; 1028 <__reset_handler_from_arm+0x8>
1024: e12fff1c bx r12
1028: 00001009 andeq r1, r0, r9
102c: 00000000 andeq r0, r0, r0
现在在cortex-m上没有arm模式,因此没有互通,但是对于向量表和汇编语言中的任何其他函数,您希望从C或其他高级调用,您需要有函数声明
我从未见过的对象声明,自从添加arm以来一直在使用gnu工具,并且一直在不需要它的情况下进行裸机引导芯片的工作…所以在这方面我帮不了你
它们保持不变的原因是因为您挂起了芯片或将其强制放入了一个您没有定义的处理程序中,所以再次挂起了芯片。处理器状态应已更改,以指示您所处的故障模式。验证向量表。我的猜测是,如果没有.type,则条目没有将函数标记为thumb所需的LSB集。所以它将被解释为ARM,可能会被解码为一些完全不相关的指令。@Jester,你能详细解释一下吗?我只有一个链接器脚本,我在其中定义了内存{…}和_estack。我的猜测是,如果没有.type,则条目没有将函数标记为thumb所需的LSB集。所以它将被解释为ARM,可能会被解码为一些完全不相关的指令。@Jester,你能详细解释一下吗?我只有一个链接器脚本,在这里我定义了内存{…}和_estack。它是armv6-m,绝对不是armv6lol,你链接了我的答案,我通常从不关注问题中的链接,但回来后感到好奇,也许有一天我会再次阅读我以前的答案…也许我在你的答案中与我现在的自我相矛盾,您写道,用于重置的向量表具有正确的地址ORRed 1 0x1009。ARM标准是否要求必须修改重置处理程序地址?我在哪里可以找到这方面的规范?它在arm核心架构参考手册中。是的,所有向量。这里暗示的是,你应该在提问之前阅读文档,而不是之后。您可能不知道的是,您应该坚持使用ARM TRM核心技术参考手册,以及ARM ARM,架构参考手册。他们的其他手册,如我所看到的程序员/用户指南,是不正确或误导的。如其他SO问题所示,YMMV。偏移量0处的条目用于初始化SP_main的值,请参阅B1-186页的SP寄存器。所有其他条目都必须将位[0]设置为1lol,您链接了我的答案,我通常从不在问题中跟随链接,但回来后感到好奇,也许有一天我会再次阅读我以前的答案…也许我正在与我现在的自我相矛盾…在您的答案中,您写道,用于重置的向量表的正确地址为1 0x1009。ARM标准是否要求必须修改重置处理程序地址?我在哪里可以找到这方面的规范?它在arm核心架构参考手册中。是的,所有向量。这里暗示的是,你应该在提问之前阅读文档,而不是之后。您可能不知道的是,您应该坚持使用ARM TRM核心技术参考手册,以及ARM ARM,架构参考手册。他们的其他手册,如我所看到的程序员/用户指南,是不正确或误导的
. 如其他SO问题所示,YMMV。偏移量0处的条目用于初始化SP_main的值,请参阅B1-186页的SP寄存器。所有其他条目的位[0]必须设置为1
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4802 ldr r0, [pc, #8] ; (1014 <hello+0x4>)
100a: 4903 ldr r1, [pc, #12] ; (1018 <hello+0x8>)
100c: f000 f80e bl 102c <__hello_from_thumb>
00001010 <hello>:
1010: ea000002 b 1020 <__reset_handler_from_arm>
1014: 00000000 andeq r0, r0, r0
1018: 00000001 andeq r0, r0, r1
101c: 00000000 andeq r0, r0, r0
00001020 <__reset_handler_from_arm>:
1020: e59fc000 ldr r12, [pc] ; 1028 <__reset_handler_from_arm+0x8>
1024: e12fff1c bx r12
1028: 00001009 andeq r1, r0, r9
0000102c <__hello_from_thumb>:
102c: 4778 bx pc
102e: e7fd b.n 102c <__hello_from_thumb>
1030: eafffff6 b 1010 <hello>
1034: 00000000 andeq r0, r0, r0
.arm
hello:
b reset_handler
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4802 ldr r0, [pc, #8] ; (1014 <hello+0x4>)
100a: 4903 ldr r1, [pc, #12] ; (1018 <hello+0x8>)
100c: f000 f800 bl 1010 <hello>
00001010 <hello>:
1010: ea000002 b 1020 <__reset_handler_from_arm>
1014: 00000000 andeq r0, r0, r0
1018: 00000001 andeq r0, r0, r1
101c: 00000000 andeq r0, r0, r0
00001020 <__reset_handler_from_arm>:
1020: e59fc000 ldr r12, [pc] ; 1028 <__reset_handler_from_arm+0x8>
1024: e12fff1c bx r12
1028: 00001009 andeq r1, r0, r9
102c: 00000000 andeq r0, r0, r0