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