Linux下NASM汇编函数和C语言函数相互调用的方法
2006-08-27 11:40
399 查看
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汇编中,要想访问变量的内容就必须用[]把变量括起,不然就是访问的变量的地址。
******************************************************************************
更新历史:
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汇编中,要想访问变量的内容就必须用[]把变量括起,不然就是访问的变量的地址。
相关文章推荐
- C语言函数和汇编函数相互调用(转)
- C语言函数和汇编函数相互调用(转)
- C语言函数和汇编函数相互调用(转)
- C语言函数和汇编函数相互调用
- linux平台学x86汇编(十九):C语言中调用汇编函数
- cocos2d JS-(JavaScript) 基础语法间的函数方法相互调用
- 从汇编角度来理解linux下多层函数调用堆栈执行状态
- 基于Linux系统调用--getrlimit()与setrlimit()函数的方法
- 汇编函数与C函数的相互调用(1)
- Linux汇编GAS调用C语言函数实例
- 汇编呼叫函数的调用方法
- Linux汇编---函数调用过程
- Linux 驱动模块及模块之前的通信(模块函数的相互调用)
- 在linux代码中打印函数调用的堆栈的方法
- 汇编函数与C函数的相互调用
- MFC单文档应用程序中各个类之间相互调用的函数方法
- 汇编语言调用C语言函数的简单方法
- 从汇编角度来理解linux下多层函数调用堆栈运行状态
- nios软核cpu中架构类shell的一种解决方式『linux 系统函数调用的方法』
- 如何在VC中汇编,调用Nasm编写的函数