vak: (Default)
[personal profile] vak
Стал я искать примеры ассемблерного кода для RISC-V, и всё попадаются какие-то ущербные. Есть hello world на rosettacode.org, но попробуйте его запустить под Линуксом - не работает. Пришлось сделать самому. Всё это под Ubuntu на процессоре PIC64.

Вот простейшая программа, выдающая текстовую строку. Используются системные вызовы 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 байт данных.

Date: 2024-11-08 07:07 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Какое всё тёплое и ламповое!

Date: 2024-11-08 09:14 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
        .asciz "Hello, world!\n"

        .section .text
        .globl _start


Видно, что ассемблер унаследовался от MACRO-11, c пропущенной гласной в .globl.
А новую директиву .section почему-то не подогнали под 6 символов.
OSZAR »