![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Стал я искать примеры ассемблерного кода для RISC-V, и всё попадаются какие-то ущербные. Есть hello world на rosettacode.org, но попробуйте его запустить под Линуксом - не работает. Пришлось сделать самому. Всё это под Ubuntu на процессоре PIC64.
Вот простейшая программа, выдающая текстовую строку. Используются системные вызовы write() и _exit(). Коды системных вызовов возьмём из стандартного include-файла syscalls.h. То есть перед ассемблером запустим препроцессор. Вот текст программы:
Вот простейшая программа, выдающая текстовую строку. Используются системные вызовы write() и _exit(). Коды системных вызовов возьмём из стандартного include-файла syscalls.h. То есть перед ассемблером запустим препроцессор. Вот текст программы:
Компилируем, запускаем.$ cat hello.S #include <sys/syscall.h> .section .data hello: .asciz "Hello, world!\n" .section .text .globl _start _start: li a7, SYS_write # system call to print a string li a0, 1 # stdout la a1, hello # text to print li a2, 14 # how many bytes ecall li a7, SYS_exit # exit the program li a0, 0 # status code ecall
Размер бинарного кода: 36 байт команд и 15 байт данных.$ cpp hello.S | as - -o hello.o $ ld hello.o -o hello $ file hello hello: ELF 64-bit LSB executable, UCB RISC-V, double-float ABI, version 1 (SYSV), statically linked, not stripped $ size hello text data bss dec hex filename 36 15 0 51 33 hello $ ./hello Hello, world!
no subject
Date: 2024-11-08 07:07 (UTC)no subject
Date: 2024-11-08 09:14 (UTC)Видно, что ассемблер унаследовался от MACRO-11, c пропущенной гласной в .globl.
А новую директиву .section почему-то не подогнали под 6 символов.