Написание путчара в ассемблере для x86_64 с 64-битным Linux? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь использовать запись syscall для воспроизведения поведения функции putchar, которая печатает один символ.Мой код выглядит следующим образом:

asm_putchar:
  push    rbp
  mov     rbp, rsp

  mov     r8, rdi

call:
  mov     rax, 1
  mov     rdi, 1
  mov     rsi, r8
  mov     rdx, 1
  syscall

return:
  mov     rsp, rbp
  pop     rbp
  ret

1 Ответ

0 голосов
/ 05 июня 2018

Из 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
...