汇编和 c同步使用

来源:互联网 发布:商城商品数据库设计 编辑:程序博客网 时间:2024/04/27 11:11

一共有三个文件 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;
}

 

原创粉丝点击