Как сделать возврат в сборке? - PullRequest
0 голосов
/ 22 октября 2019

Привет, у меня очень сложный вопрос. Я написал функцию в сборке x64, а затем я хотел использовать ее в моем main.c. Я включил функцию сборки через файл заголовка. main.c:

#include <stdio.h>
#include "myunistd.h"
#include "mystddef.h"


int main(){

mywrite(1, "Test", 4);

}

myunistd.h:

#ifndef MYUNISTD_H
#define MYUNISTD_H

struct myrusage {};
ssize_t spastwrite(int fd, const void *buf, size_t count);

#endif

myunistd.s:

global mywrite

section .text

mywrite:
  mov r8, rdi       ; parameters in registers only for testing
  mov r9, rsi
  mov r10, rdx
  mov rax, 1            ; write(
  mov rdi, r8           ;   STDOUT_FILENO,
  mov rsi, r9       ;   String,
  mov rdx, r10      ;   sizeof String
  syscall               ; );

  mov rax, 60           ; exit(
  mov rdi, 0            ;   EXIT_SUCCESS
  syscall               ; );



Функция работает, но у меня нет возвращаемого аргумента, как воригинал написать системный вызов. Также имейте предупреждение "неявное объявление функции 'mywrite' недопустимо в C99". Также полезно знать, что я определил size_t как unsigned long в mystddef.h. Я не знаю. Надеюсь, что вы можете помочь:)

Скомпилировано с: nasm -f elf64 myunistd.s -o myunistd.o
clang main.c myunistd.o -o exe

Thx

1 Ответ

1 голос
/ 22 октября 2019

Вместо использования системного вызова exit используйте ret:

global mywrite

section .text

mywrite:
  mov r8, rdi       ; parameters in registers only for testing
  mov r9, rsi
  mov r10, rdx
  mov rax, 1            ; write(
  mov rdi, r8           ;   STDOUT_FILENO,
  mov rsi, r9       ;   String,
  mov rdx, r10      ;   sizeof String
  syscall               ; );
  ret

. В вашем myunistd.h вы объявляете spastwrite, а не mywrite. Измените это:

ssize_t spastwrite(int fd, const void *buf, size_t count);

на это:

ssize_t mywrite(int fd, const void *buf, size_t count);

и оно будет работать.

...