rusi/include/stdvv.c

53 lines
1.4 KiB
C
Raw Normal View History

// stdvv.c - реализация русского ввода/вывода
#include "stdvv.h"
long syscall3(long number, long arg1, long arg2, long arg3) {
asm("mov %rcx, %r10");
asm("mov %rdi, %rax");
asm("mov %rsi, %rdi");
asm("mov %rdx, %rsi");
asm("mov %r10, %rdx");
asm("syscall");
}
long длина_строки(const char *s) {
long len = 0;
while (s[len]) len++;
return len;
}
int печатьф(const char *формат, ...) {
long len = длина_строки(формат);
return (int)syscall3(1, 1, (long)формат, len);
}
int печать(const char *строка) {
long len = длина_строки(строка);
return (int)syscall3(1, 1, (long)строка, len);
}
int вывод_строки(const char *строка) {
int result = печать(строка);
симв_вывод('\n');
return result;
}
int симв_вывод(int c) {
char ch = (char)c;
return (int)syscall3(1, 1, (long)&ch, 1);
}
void завершение(int код) {
syscall3(60, код, 0, 0);
for (;;) {}
}
// assert - проверка условия для тестов
void assert(int expected, int actual, char *code) {
if (expected != actual) {
printf("ОШИБКА: ожидалось %d, получено %d (%s)\n", expected, actual, code);
завершение(1);
}
}