Linux下NASM汇编函数和C语言函数相互调用的方法

来源:互联网 发布:软件定制开发平台 编辑:程序博客网 时间:2024/05/01 22:05

                               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汇编中,要想访问变量的内容就必须用[]把变量括起,不然就是访问的变量的地址。 

原创粉丝点击