Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39421
  • 博文数量: 8
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-30 23:24
文章分类

全部博文(8)

文章存档

2011年(1)

2009年(7)

我的朋友
最近访客

分类: LINUX

2009-05-24 02:32:05

linux中的汇编语言开发一般采用的是AT&T语法,而一些老版本的as对于intel的语法支持还不是很好,保险起见还是用AT&T语法才是王道啊 呵呵

 

# filename:hello.s
# development environment: Linux as ld gdb IA-32

.section .data
output:
    .asciz "hello world\n"
.section .text
.globl _start

_start:
    pushl $output #将标签引用的内存地址压入栈中
    call printf #调用C语言的printf函数
    pushl $123 #将立即数压入栈中以测试返回值
    call exit

 

先汇编一下吧:

as -gstabs -o hello.o hello.s

接下来的连接是关键:

ld -dynamic-linker /lib/ld-linux.so.2 -lc -o hello hello.o

最后看一下返回值:

echo $?

如果正常,结果应为:123

 

注:

-gstabs参数是包含每行代码的调试信息

-dynamic-linker /lib/ld-linux.so.2如果没有这个参数,当你运行时会出现无法找到文件或者目录的错误信息,问题在于连接器ld可以解析C函数但是函数本身没有包含在最终可执行的程序中,因此还必须在执行时加载“动态库”的程序,在Linux系统中这个程序一般为linux.so.2这个程序通常在/lib目录下

linux中把C语言连接到汇编语言程序有两种方法:

N0.1静态链接(static linking)静态链接把函数目标代码直接连接到可执行文件中,这样会制造巨大的可执行程序,而且同时运行多个实例,就会造成系统资源的浪费(每个实例都会有自己相同函数的拷贝)

NO.2动态链接库(dynamic linking)程序运行时自动调用动态库,并且多个程序间可以共享库

阅读(1317) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:python密码无回显getpass的简单实例

给主人留下些什么吧!~~