C和汇编联合编译

chengpeng0723 2011-01-20 11:04:19
汇编代码:
EXTRN _cmain
PUBLIC _myprint

.MODEL TINY
.CODE
.186


.CODE

org 0100h

_start PROC

jmp begin
nop
DB 'TianXiangYuan',0 ;the magic of my os

begin:
cli
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0FFFFh
sti
call _cmain ;调用C语言写的主函数
mov ax,4c00h ;调用DOS的功能(为了调试),与我们自己的操作系统无关
int 21h

_start ENDP


_myprint PROC
mov ah, 0Eh ; ┃ 每读一个扇区就在 "Booting " 后面打一个点, 形成这样的效果:
mov al, 'P' ; ┃
mov bl, 0Fh ; ┃ Booting ......
int 10h
ret
_myprint ENDP

END _start

C代码:
extern void myprint(void);

void cmain(void)
{
myprint();
}

分别编译,通过
链接时,tlink /t 1.obj 2.obj ;/t表示生成.com文件
我使用的是bc45编译器,结果提示data below initial CS:IP defined

不解,请各位大侠打酱油的时候帮忙下!感激不尽!
...全文
210 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
争取->正确 :)
  • 打赏
  • 举报
回复
生成.exe也是可以的。
但是你的汇编和c程序都要调整,尤其是c程序,不是tiny模式,就有多个段,它的初始化代码c0*.obj也要连接进去,还要先执行,否则代码无法争取执行。
chengpeng0723 2011-01-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 delphiguy 的回复:]
这个... 应该是可以的,你确定出错的代码和你列出来的是一样的吗?

假设你的2个文件叫1.asm和2.c,如下编译连接是可以通过的:
tasm /ml 1.asm
bcc -mt 2.c 1.obj
tlink /t 1.obj 2.obj

另外,注意这句“EXTRN _cmain”应该声明为EXTRN _cmain: near,否则后面的调用会生成错误的间接调用指令,而不是直接……
[/Quote]
我现在想编译出exe文件
tasm 1.asm
bcc 2.c
tlink 1.obj 2.obj
这样搞出来不行,请问为什么?
  • 打赏
  • 举报
回复
这个... 应该是可以的,你确定出错的代码和你列出来的是一样的吗?

假设你的2个文件叫1.asm和2.c,如下编译连接是可以通过的:
tasm /ml 1.asm
bcc -mt 2.c 1.obj
tlink /t 1.obj 2.obj

另外,注意这句“EXTRN _cmain”应该声明为EXTRN _cmain: near,否则后面的调用会生成错误的间接调用指令,而不是直接调用。(声明不改,后面用call near ptr _cmain也可以。)


从汇编进入,就是把c模块连接进汇编程序中,这样当然也是可以的,但是如果c代码中使用了c库(不管直接还是间接),或者使用了全局变量而不是tiny模式,那还需要把c的启动模块(c0x.obj)和标准库(cx.lib)和任何其他用到的库连接进汇编程序。还是比较复杂的。
chengpeng0723 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zara 的回复:]
将 org 语句去掉试试?TINY 模式的话,开始运行应该是在 c 的初始化部分,不会是你这里的这片汇编的代码。
[/Quote]
另,我这里是想从汇编进入的,END _start,不行么?
chengpeng0723 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shzhfu 的回复:]
.com文件要求程序的所有内容在一个段中。你这里应该是因为1.obj和2.obj中的程序不在同一个段造成的。
[/Quote]
请具体说下这里应该如何解决?
chengpeng0723 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zara 的回复:]
将 org 语句去掉试试?TINY 模式的话,开始运行应该是在 c 的初始化部分,不会是你这里的这片汇编的代码。
[/Quote]
去掉就无法编译通过了!
shzhfu 2011-01-21
  • 打赏
  • 举报
回复
.com文件要求程序的所有内容在一个段中。你这里应该是因为1.obj和2.obj中的程序不在同一个段造成的。
zara 2011-01-21
  • 打赏
  • 举报
回复
将 org 语句去掉试试?TINY 模式的话,开始运行应该是在 c 的初始化部分,不会是你这里的这片汇编的代码。
chengpeng0723 2011-01-21
  • 打赏
  • 举报
回复
上边的程序是拷过来的,有一些注释没有用!
wolfstudent 2011-01-21
  • 打赏
  • 举报
回复
占个座。。。。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧