Pull to refresh
0
0
Send message

Но есть же проект LLVM, в котором как раз и используется некий "высокоуровневый" ассемблер с виртуальными регистрами, а backend транслирует его в машинный код под конкретную архитектуру.

Если хочется добавить поддержку периферии МК, то можно использовать LLVM API, чтобы написать свой front-end для LLVM.

Вот пример кода (HelloWorld, сложение a + b в с, а также дергание пином/реле):

; ModuleID = 'main'
source_filename = "main"
target triple = "thumbv7m-none-none-eabi"

@__str0__ = constant [14 x i8] c"Hello, World!\00"

declare void @RELAY_TOGGLE(i32 %0)
declare void @Println(i8* %0)

define i32 @main() {
entry:
  %a = alloca i32
  store i32 10, i32* %a

  %b = alloca i32
  store i32 5, i32* %b

  %a1 = load i32, i32* %a
  %b2 = load i32, i32* %b
  %add = add i32 %a1, %b2

  %c = alloca i32
  store i32 %add, i32* %c

  %c3 = load i32, i32* %c
  tail call void @RELAY_TOGGLE(i32 %c3)

  tail call void @Println(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @__str6__, i32 0, i32 0))
  
  br label %end
end:                                              ; preds = %entry
  ret i32 0
}

Information

Rating
Does not participate
Registered
Activity

Specialization

Fullstack Developer, Embedded Software Engineer
Lead
C++
Assembler
C
Golang
Unix
OOP
Docker
Java
SQL