软件准备
- ubuntu
- 交叉编译链工具:arm-none-eabi-gcc, arm-none-eabi-as, arm-none-eabi-ld
- qemu仿真软件:支持stm32版本
- 调试工具:gdb-multiarch
启动仿真实验
- 汇编代码
.thumb
.syntax unified
.equ STACKINIT, 0x20005000
.section .text
.org 0
vectors:
.word STACKINIT
.word _start+1
_start:
MOV R0, #10
MOV R1, #20
SUBS R0, R0, R1
MRS R2, PSR
b _start
- 对汇编文件进行汇编
arm-none-eabi-as start.asm -mcpu=cortex-m3 -mthumb -o start.out -g
- 链接脚本
SECTIONS {
. = 0x0
.text : {
*(.text)
}
}
- 对目标文件进行链接
arm-none-eabi-ld start.out -T embed.ld -nostartfiles -o embed.elf
- 从elf文件生成二进制文件
arm-none-eabi-objcopy -O binary embed.elf embed.bin
- 启动qemu
qemu-system-arm -s -S -M stm32-p103 -nographic -kernel embed.bin
- 启动gdb调试工具
gdb-multiarch embed.elf
target remote localhost:1234
实验结果
启动gdb调试之后,并且连接到qemu之后的结果如下:
将汇编代码和寄存器内容实现:
layout asm
layout reg
结果:
使用si
命令,执行下一条汇编命令
可以看到R0
寄存器的内容已经变为了我们的预设值: 10
再次执行si
命令,可以看到R1
寄存器的值也变为了我们的预设值: 20
重复执行命令si
,会发现程序重新回到_start
的开始位置,和预期结果一致