没有.type宏,ARM程序集无法工作



我正在学习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 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宏时,我没有通过调试器看到寄存器中有任何变化,但根据这篇stackoverflow帖子,.type-宏应该没有任何效果。

删除.type宏时,为什么寄存器r0r1保持不变

.syntax unified
.cpu cortex-m0
.fpu softvfp
.thumb
.global vector_table
.global reset_handler
.type vector_table, %object
vector_table:
.word 0x20001000
.word reset_handler
.type reset_handler, %function
reset_handler:
LDR r0, =0
LDR r1, =1

具有.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

用于复位的矢量表具有具有1 0x1009的正确地址ORRed。如果删除功能声明

disassembly of section .text:
00001000 <vector_table>:
1000:   20001000    andcs   r1, r0, r0
1004:   00001008    andeq   r1, r0, r8
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

你得到的二进制文件不会在cortex-m上启动。对于拇指,你也可以使用.tumb_func,找到的下一个标签被认为是一个函数:

.thumb_func
reset_handler:
LDR r0, =0
LDR r1, =1

如果你再次表现出色,二进制文件将起作用:

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

如果你想让gnu(链接器(在函数之间蹦床,这也是拇指交互所必需的:

.syntax unified
.cpu arm7tdmi
.thumb
.global vector_table
.global reset_handler
.type vector_table, %object
vector_table:
.word 0x20001000
.word reset_handler
.thumb_func
reset_handler:
LDR r0, =0
LDR r1, =1
bl hello
.arm
.type hello, %function
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 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

现在在cortex-m上,您没有arm模式,因此没有互通,但对于向量表和任何其他汇编语言中的函数,您需要从C或其他高级调用函数声明。

我从未见过的对象声明,自从arm被添加以来,一直在使用gnu工具,并且一直在做裸金属引导芯片的事情,而不需要它…所以在那里帮不了你。

它们保持不变的原因是因为你挂起了芯片,或者把它强行放进了一个你没有定义的处理程序中,所以又挂起了这个芯片。处理器状态应该已经改变,以指示您所处的故障模式。

最新更新