LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1321|回复: 3

C和asm的ld问题

[复制链接]
发表于 2007-8-25 11:53:15 | 显示全部楼层 |阅读模式
就像Linux中的heads.s和system代码的link一样,如何将heads.s连接成代码从地址0开始呢??
(我是说,标号start:后的代码,要从在连接后的文件的1个字节开始)
(用gas,gcc,gld)
我用as86写的demo


  1. entry start
  2. IDT_Base=512
  3. start:
  4. .org 0x00
  5.         mov ax,#0x10
  6.         mov ds,ax
  7.         mov ax,#0xff00
  8.         mov [0x000000],ax
  9.         cmp [0x100000],ax
  10.         je L6

  11.         mov edi,#0x0b8000
  12.         mov esi,#msg
  13.         mov ah,0x0c
  14.         mov ecx,#(msg_end-msg)
  15. print_str:
  16.         mov al,[esi]
  17.         mov [edi] ,ax
  18.         inc esi
  19.         inc edi
  20.         inc edi
  21.         loop print_str

  22.         lea edx,[intr_svr]
  23.         mov eax,#0x00080000
  24.         mov ax,dx
  25.         mov dx,#0x8e00
  26.         mov  edi,#IDT_Base
  27.                 ;point to the end of this program.'s next word
  28.         mov ecx,#256
  29. rp_sidt:
  30.         mov [edi],eax
  31.         mov 4[edi],edx
  32.         add edi,#8
  33.         loop rp_sidt
  34.         lidt [idt_attr]
  35. Set_up_Stack:
  36.         mov esp,#0x1000
  37.         mov ax,#0x10
  38.         mov ss,ax
  39.         ;mov ax,#0x0d40
  40.         sti
  41. L6:        jmp L6
  42. .align 8
  43. intr_svr:
  44.         cli
  45.         mov ax,#0x0d41
  46.         mov [0x0b8320],ax
  47.         mov al,#0x20
  48.         out #0x20,al
  49.         sti
  50.         iretd
  51. .align 8
  52. idt_attr:
  53.         .word 256*8-1
  54.         .long IDT_Base
  55. .org 320
  56. msg:
  57.         .ascii "Procted Mode"
  58. msg_end:
  59. .org 510
  60. IDT_1:
  61. .word 0x3040
复制代码


编译后,要用:
as86 -3 -b sec2 demo.asm
dd if=sec2 of=/dev/fd0 ibs=1 count=512 skip=5 obs=512 seek=1写到2 扇区.
大家应当注意到skip=5,也就是as86生成的代码,0代码是从第6个字节开始的。
我用gas重写后,和C代码连接,一样有这个问题。

如果这样,生成elf文件是没有问题的。但要是自已写个操作系统,装载代码就成问题了。
发表于 2007-9-26 10:29:58 | 显示全部楼层
写连接脚本啊,具体看ld的文档吧。
一些bootloader的连接脚本很值得你参考,譬如 u-boot。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-26 16:30:59 | 显示全部楼层
十分感谢robinswan

我写了个简单的ldscript。果然有用
回复 支持 反对

使用道具 举报

发表于 2007-9-27 00:00:47 | 显示全部楼层
当然有用了
ld 命令那是很强大的

也可以看看PMON
回复 支持 反对

使用道具 举报

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

本版积分规则

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