LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: nait

汇编的问题

[复制链接]
发表于 2005-5-17 22:28:18 | 显示全部楼层
尽管程序中没有用到标准库函数,但我认为-lc还是有必要的,因为ctr*.o好象要用到libc.so中定义的符号。
回复 支持 反对

使用道具 举报

发表于 2005-5-17 22:30:45 | 显示全部楼层
Post by realtang
-dynamic-linker /lib/ld-linux.so.2
而且这个也可以去掉。
我的操作:
debian:/home/apple# gcc -S t.c -o t.s
debian:/home/apple# as t.s -o t.o
debian:/home/apple# ld -e main t.o -o t
没有任何问题

你这样做没有连接必要的初始化和退出模块(crt*.o)。虽然链接时不出现问题,但运行时会出错。
回复 支持 反对

使用道具 举报

发表于 2005-5-17 22:34:04 | 显示全部楼层
re.应该这么做

Post by realtang
不需要采用c库。
ld 没采用-e ADDRESS选项,ld -e main 应该就可以了。
-e选项的含义是,指定程序进入点的地址(--entry)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-18 09:13:21 | 显示全部楼层
Post by Tetris
re.应该这么做

我试过这样做了啊
但还是有段错误
我上面已经帖出来了  :confused:  :confused:

还有,为什么我直接用汇编编的程序就没有这么麻烦,而用c转化后汇编起来却这么麻烦,难道这其中有什么本质的区别么?
回复 支持 反对

使用道具 举报

发表于 2005-5-18 09:16:31 | 显示全部楼层
你怎么直接用汇编的?
帖出来看看呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-18 09:57:11 | 显示全部楼层
我是说直接用汇编编helloworld之类的程序

用汇编编这个程序,以后再说吧,现在没时间
在说了,现在汇编水平实在拿不出手
回复 支持 反对

使用道具 举报

发表于 2005-5-18 11:19:21 | 显示全部楼层
帖个网上的helloworld程序:

.data                    # 数据段声明
        msg : .string "Hello, world!\\n" # 要输出的字符串
        len = . - msg                   # 字串长度

.text                    # 代码段声明
.global _start           # 指定入口函数
        
_start:                  # 在屏幕上显示一个字符串
        movl $len, %edx  # 参数三:字符串长度
        movl $msg, %ecx  # 参数二:要显示的字符串
        movl $1, %ebx    # 参数一:文件描述符(stdout)
        movl $4, %eax    # 系统调用号(sys_write)
        int  $0x80       # 调用内核功能
        
                         # 退出程序
        movl $0,%ebx     # 参数一:退出代码
        movl $1,%eax     # 系统调用号(sys_exit)
        int  $0x80       # 调用内核功能


看到了什么? 最后,调用了 exit 函数,而不是 ret ,这样就不会有问题了.
回复 支持 反对

使用道具 举报

发表于 2005-5-18 13:07:03 | 显示全部楼层
用C言语写的程序好像要先通过一个什么引导程序一类的东西调用吧?main必不是入口,所以用ret是正确的,但是要再链上一个什么库。嗯,估计是这样。
用nasm写的hello world

  1.     global  main

  2. msg:    db  "Hello World!\n"
  3. len     equ $ - msg

  4. main:
  5.     mov edx, len
  6.     mov ecx, msg
  7.     mov ebx, 1
  8.     mov eax, 4
  9.     int $80

  10.     mov ebx, 0
  11.     mov eax, 1
  12.     int $80
复制代码

感觉nasm比较容易看懂一些。
编译:
nasm -felf -o hello.o hello.asm
链接:
ld -e main -o hello hello.o
-e参数很重要,指明程序的入口。
回复 支持 反对

使用道具 举报

发表于 2005-5-18 15:10:41 | 显示全部楼层
Post by Tetris
用C言语写的程序好像要先通过一个什么引导程序一类的东西调用吧?main必不是入口,所以用ret是正确的,但是要再链上一个什么库。嗯,估计是这样。

这跟用什么语言写程序没有关系,重点是,一个程序如何被加载,如何执行,如何终止.
明白这些,上面的问题都明白了.
正如你写的这个汇编程序,关键在于最后调用了exit函数,能够时进程正常的退出.
至于一个进程如何开始,估计大部分人都知道.
回复 支持 反对

使用道具 举报

发表于 2005-5-18 15:38:09 | 显示全部楼层
Post by rickxbx
这跟用什么语言写程序没有关系,重点是,一个程序如何被加载,如何执行,如何终止.
明白这些,上面的问题都明白了.
正如你写的这个汇编程序,关键在于最后调用了exit函数,能够时进程正常的退出.
至于一个进程如何开始,估计大部分人都知道.


我的意思是用C写的程序链接完了入口并不是main,而是从另一个地方开始,做完一些初始化工作之后再call main。main返回之后那段代码再调用exit。当然如果在main中直接调用exit退出也可以。
这当然和语言有关系,用汇编写的就没有这样的一段引启程序了,我们必须指明程序的入口。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表