返回介绍

2. 调用 C 函数

发布于 2024-10-13 10:58:57 字数 1179 浏览 0 评论 0 收藏 0

用 C 和 NASM 混合编程。

调用 C 函数

; main.s

global main

section .text

  main:
    push  rbp
    mov   rbp, rsp

    extern  add
    mov   rdi, 11
    mov   rsi, 22
    call  add

    extern  printhex
    mov   rdi, rax
    call  printhex

    extern  exit
    mov   rdi, 0
    call  exit

    mov   rsp, rbp
    pop   rbp
    ret
// lib.c

#include <stdio.h>

long add(long x, long y)
{
  return x + y;
}

void printhex(long x)
{
  printf("%lx\n", x);
}
$ nasm -g -F dwarf -f elf64 -o main.o main.s
$ gcc -gdwarf -O0 -c -o lib.o lib.c
$ gcc -no-pie -o test main.o lib.o

$ ./test
21

调用 ASM 函数

// main.c

#include <stdio.h>

extern long add(long, long);

int main(int argc, char *argv[])
{
  printf("%lx\n", add(11l, 22l));
  return 0;
}
; add.s

global add

section .text
  add:           ; long add(long x, long y)
    push  rbp
    mov   rbp, rsp

    mov   rax, rdi   ; arg.x
    add   rax, rsi   ; + arg.y

    mov   rsp, rbp
    pop   rbp
    ret
$ nasm -g -F dwarf -f elf64 -o add.o add.s
$ gcc -gdwarf -O0 -c -o main.o main.c
$ gcc -no-pie -o test main.o add.o

$ ./test
21

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文