汇编和 c同步使用

一共有三个文件 makefile foo.asm bar.c

函数调用遵循的是c调用约定,后面的参数先入栈,并由调用者清理堆栈

 

makefile

-------------------

 

.PHONY: all clean

all: foobar

foobar: foo.o bar.o
 ld -s -o foobar foo.o bar.o

foo.o: foo.asm
 nasm -f elf -o foo.o foo.asm

bar.o: bar.c
 gcc -c -o bar.o bar.c

clean:
 rm -f bar.o foo.o foobar

 

foo.asm

-------------------

 


; 编译链接方法
; (ld 的‘-s’选项意为“strip all”)
;
; [root@XXX XXX]# nasm -f elf foo.asm -o foo.o
; [root@XXX XXX]# gcc -c bar.c -o bar.o
; [root@XXX XXX]# ld -s hello.o bar.o -o foobar
; [root@XXX XXX]# ./foobar
; the 2nd one
; [root@XXX XXX]#


extern choose ; int choose(int a, int b);


[section .data] ; 数据在此

num1st  dd 3
num2nd  dd 4


[section .text] ; 代码在此

global _start ; 我们必须导出 _start 这个入口,以便让链接器识别。
global myprint ; 导出这个函数为了让 bar.c 使用

_start:
 push num2nd  ; ┓
 push num1st  ; ┃
 call choose  ; ┣ choose(num1st, num2nd);
 add esp, 4  ; ┛

 mov ebx, 0
 mov eax, 1  ; sys_exit
 int 0x80  ; 系统调用

; void myprint(char* msg, int len)
myprint:
 mov edx, [esp + 8] ; len
 mov ecx, [esp + 4] ; msg
 mov ebx, 1
 mov eax, 4  ; sys_write
 int 0x80  ; 系统调用
 ret
 

bar.c

-------------------------------

 


void myprint(char* msg, int len);

int choose(int a, int b)
{
 if(a >= b){
  myprint("the 1st one/n", 13);
 }
 else{
  myprint("the 2nd one/n", 13);
 }

 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值