我目前在 11 年级,在课堂上用汇编程序进行了一些编程。为了好玩,我坐下来尝试使用 Rust 而不是汇编程序。我设法让 LED 灯亮起,但闪烁仍然不起作用。我想问问是否有人可以给我一些关于如何使这段代码更好地工作或让它工作的提示。我试着只用不安全的和 write_volatile 来做到这一点。我将项目上传到 Github 存储库:https://github.com/HttpRafa/school/tree/asm-j0
我已经用完整的汇编程序编写了 Blink 程序并且它可以工作。所以所有的地址和偏移量都应该是正确的。
.word 0x20000400 //Anfang Stackpionter -> SP
.word 0x080000ed //reset_handler: Programmadresse nach reset
.space 0xe4 //Reservierter Platz für Interrupt-Vektoren
//###### Registerdefinitionen: Namen, Basisadresse/Offset ######
.equ RCC,0x40023800 //Basisadresse: System-Clock
.equ AHBENR,0x1C //Offset:
.equ GPIOA,0x40020000 //Basisadresse GPIOA
.equ MODER,0x00 //Offset: MODER "Mode Register"
.equ ODR,0x14 //Offset: ODR "Output Data Register"
.global _start //für Linker wichtig: Definition, an welcher Adresse das Programm anfängt
_start:
ldr r1, =RCC //GPIOA,B,C aktivieren (7:...111)
ldr r0, =0x00008007 //
str r0, [r1,AHBENR]
ldr r1, =0x40020000
ldr r0, =0xA8000400
str r0, [r1, #0x00]
main:
bl led_on
bl wait
bl led_off
bl wait
b main //Endlosschleife Hauptprogramm- Sprung zu main
wait:
mov r3, #65000
mov r4, #0
for_0:
add r4, r4, #1
cmp r4, r3
bne for_0
bx r14
led_on:
ldr r0, =0x20
ldr r1, =0x40020000
str r0, [r1, #0x14]
bx r14
led_off:
ldr r0, =0x00
ldr r1, =0x40020000
str r0, [r1, #0x14]
bx r14`