Linux下NASM汇编函数和C语言函数相互调用的方法
******************************************************************************
更新历史:
2006/08/27 添加了征求于渊本人的意见的修改方法
******************************************************************************
汇编语言,我很喜欢,因为它是没有什么语言可以代替的。
最近也做了些A语言和C语言相互调用的实验(我把assemble language叫做A语言你没有意见吧?)。
关于在writeos论坛http://writeos.com/writeos/bbs/showbbs.asp?bd=6&id=40&totable=1,
我发的《于渊在讲C语言和汇编语言相互调用的例子中的小bug》的帖子上
有个叫nick弟兄问我不改C程序,只改A语言的foo.asm的文件怎么修改这个bug的问题我今天在这
给你我的回答:
本实验包括三个文件:
1.foo.asm
2.bar.c
3.Makefile
我对foo.asm的修改方法:
;****************************************************************************/
;*文 件:foo.asm
;*作 者:李祥光
;*出 处:ufolab 实验笔记
;****************************************************************************/
extern choose ;int choose( int a,int b );
[section .data] ;数据段开始
num1st dd 3
num2nd dd 4
[section .text] ;代码段开始
global _start
global myprint
_start:
mov eax,[num2nd]
push eax
mov eax,[num1st]
push eax
call choose
add esp,8
mov ebx,0
mov eax,1
int 0x80
myprint: ;void myprint(char *msg,int len)
mov edx,[esp+8] ;len
mov ecx,[esp+4] ;msg
mov ebx,1
mov eax,4
int 0x80
ret
以下是没有修改的bar.c
/****************************************************************************/
/* 文 件:bar.c
/* 作 者:于渊
/* 出 处:《自己动手写操作系统》
/****************************************************************************/
void myprint( char *msg, int len );
int choose( int a, int b ){
if ( a >= b ) {
myprint( "this 1st one/n", 13 );
} else {
myprint( "this 2nd one/n", 13 );
}
return 0;
}
有的弟兄不知道怎么编译, 我写了个Makefile,如下:
#****************************************************************************/
#* 文 件:Makefile
#* 作 者:李祥光
#* 出 处:ufolab 实验笔记
#****************************************************************************/
#Makefile begin
foobar:foo.o bar.o
[Tab key] gcc -Wall -o $@ $^
bar.o:bar.c
[Tab key] gcc -c $<
foo.o:foo.asm
[Tab key] nasm -f elf $<
clean:
[Tab key]rm *.o foobar
#Makefile end
注意:[Tab key]的意思就是在那必须要用一个Tab键。
使用方法:
1.make all 命令用来编译
2.make clean 命令用来删除中间文件和目标文件,好重新编译
以下就是征求于渊本人的意见的修改方法
http://blog.csdn.net/forrestyu/archive/2006/05/07/711520.aspx
;****************************************************************************/
;*文 件:foo.asm
;*作 者:于渊
;*出 处:CSDN 于渊专栏⇒http://blog.csdn.net/forrestyu
;****************************************************************************/
extern choose ;int choose( int a,int b );
[section .data] ;数据段开始
num1st dd 3
num2nd dd 4
[section .text] ;代码段开始
global _start
global myprint
_start:
push dword [num2nd]
push dword [num1st]
call choose
add esp,8
mov ebx,0
mov eax,1
int 0x80
myprint: ;void myprint(char *msg,int len)
mov edx,[esp+8] ;len
mov ecx,[esp+4] ;msg
mov ebx,1
mov eax,4
int 0x80
ret
部分结论:
#****************************************************************************/
#* 文 件:A语言和C语言相互调用结论
#* 作 者:李祥光
#* 出 处:ufolab 实验笔记
#****************************************************************************/
1.在NANM汇编中,要想访问变量的内容就必须用[]把变量括起,不然就是访问的变量的地址。