Chinaunix

标题: 一个关于c语言和汇编互相调用的问题 [打印本页]

作者: garyneville    时间: 2010-03-07 18:26
标题: 一个关于c语言和汇编互相调用的问题
我希望在x86的实模式下,使用c语言程序,而不是在保护模式下。
  我的实验环境为
  OS=Ubuntu 9.04
  C compile = bcc
  /***hello.c*****/
  1.   extern void myprint();
  2. int main()
  3. {
  4.     myprint();
  5.     return 0;
  6. }
复制代码
/****boot.s******/
  1. .global begtext,begdata,begbss,endtext,enddata,endbss
  2. .text
  3. begtext:
  4. .data
  5. begdata:
  6. .bss
  7. begbss:
  8. .text
  9. .extern _main
  10. .global _myprint
  11. BOOTSEG = 0x07c0

  12. entry   start
  13. start:
  14.     jmpi    go,BOOTSEG
  15. go: mov     ax,cs
  16.     mov     ds,ax
  17.     mov     es,ax
  18.     mov     cx,#19
  19.     mov     dx,#0x0c00
  20.     mov     bx,#0x000c
  21.     mov     bp,#msg1
  22.     mov     ax,#0x1301
  23.     int     0x10
  24.     call    _main  
  25. _myprint:
  26.     mov     ax,cs
  27.     mov     ds,ax
  28.     mov     es,ax
  29.     mov     cx,#15
  30.     mov     dx,#0x0d00
  31.     mov     bx,#0x000f
  32.     mov     bp,#msg2
  33.     mov     ax,#0x1301
  34.     int     0x10
  35.     ret
  36. msg1: .ascii "Booting system..."
  37.       .byte 13,10
  38. msg2: .ascii "Hello baby..."
  39.       .byte 13,10
  40. .org  510
  41.       .word 0xAA55
  42. .text
  43. endtext:
  44. .data
  45. enddata:
  46. .bss
  47. endbss:
  48. !end of boot.s
复制代码
我的编译步骤是
bcc -ansi -c hello.c
as86 -0 -a  -o boot.o  boot.s
ld86 -0 -s -o boot boot.o hello.o
dd bs=32 if=boot of=boot.img skip=1
问题处在ld86这一步上,hello.o的内容根本没有链接进boot里面,请问问题出在哪里,搞了很久实在不明白,另外boot.s中myprint的实现很山寨,一是不会这种8086的汇编。也是网上几乎找不到关于这种Minix汇编的资料,请高人指点。
作者: mik    时间: 2010-03-07 22:12
还是使用 gcc 吧

推荐你看一看这个文档:

http://www.nondot.org/sabre/os/f ... sUsingACompiler.pdf
作者: garyneville    时间: 2010-03-08 10:24
我大概看了下文档,主要是讲x86的保护模式的,不过还是要谢谢2L回复哈。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2