嗨,我有一个非常困难的问题。我在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               ; );





该函数有效,但是我没有像原始写入syscall一样返回参数。也有警告“函数'mywrite'的隐式声明在C99中无效”。
对您也很高兴,我在mystddef.h中将size_t定义为unsigned long。
我不知道。希望你能帮助:)

编译:nasm -f elf64 myunistd.s -o myunistd.o
lang main.c myunistd.o -o exe

谢谢

最佳答案

代替使用exit syscall,使用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);


它会工作。

10-08 08:08