Из man 2 write
вы можете увидеть подпись write
is,
ssize_t write(int fd, const void *buf, size_t count);
Требуется указатель (const void *buf
) на буфер в памяти.Вы не можете передать его char
по значению, поэтому вам нужно сохранить его в памяти и передать указатель.
(Не печатайте по одному символу за раз, если у вас есть только один для печати,это действительно неэффективно. Создайте буфер в памяти и распечатайте его. Например, эта функция NASM для Linux x86-64: Как вывести целое число при программировании на уровне сборки без printf из библиотеки c? )
Версия NASM GCC: putchar (char) во встроенной сборке :
; x86-64 System V calling convention: input = byte in DIL
; clobbers: RDI, RSI, RDX, RCX, R11 (last 2 by syscall itself)
; returns: RAX = write return value: 1 for success, -1..-4095 for error
writechar:
mov byte [rsp-4], dil ; store the char from RDI
mov edi, 1 ; EDI = fd=1 = stdout
lea rsi, [rsp-4] ; RSI = buf
mov edx, edi ; RDX = len = 1
syscall ; rax = write(1, buf, 1)
ret