Стал я искать примеры ассемблерного кода для 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
Компилируем, запускаем.
$ 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!
Размер бинарного кода: 36 байт команд и 15 байт данных.
no subject
Date: 2024-11-08 07:07 (UTC)no subject
Date: 2024-11-08 09:14 (UTC).asciz "Hello, world!\n" .section .text .globl _startВидно, что ассемблер унаследовался от MACRO-11, c пропущенной гласной в .globl.
А новую директиву .section почему-то не подогнали под 6 символов.