在C语言中调用汇编语言子程序 程序连接失败 10

我有两个文件,test.c和fun.asm/*test.c*/intexternSUM(inta,intb);//函数的定义在汇编模块中,功能是返回a+b的值main()... 我有两个文件,test.c和fun.asm

/*test.c*/

int extern SUM(int a,int b); //函数的定义在汇编模块中,功能是返回a+b的值

main()
{
int i;

i=SUM(25,25);

printf("i=%d\n",i);
}

/*fun.asm*/

.MODEL SMALL
.CODE

PUBLIC _SUM

_SUM PROC NEAR
PUSH BP
MOV BP,SP
MOV AX,WORD PTR [BP+4];取出第一个25
ADD AX,WORD PTR [BP+6];取出第二个25并与第一个相加放入AX作为返回值
POP BP
RET 4

_SUM ENDP

END

编译的时候:
用过TC,BC,VC,MASM,TASM32 试了很多次都连接失败
test.obj : warning LNK4033: converting object format from OMF to COFF
test.obj : fatal error LNK1190: invalid fixup found, type 0x0002

有时还会出现no entry point 问题

只有用CL命令 cl /c test.c
生成 test.obj
用masm fun.asm
生成fun.obj

link test.obj fun.obj

出现
fun.obj : warning LNK4033: converting object format from OMF to COFF

但是只是警告,可以生成test.exe
运行的时候出现错误,内存不能为read问题
对test.exe进行调试,程序停在0040102B处(见图),BP+4和BP+6中的BP都变成了SI,
不知道是怎么回事,[ESI+4]处内存无法访问,出错!!!
用命令 tcc -S -ms test.c
将test.c 编译成汇编语言如下:(不知道是怎样定义入口点的,也不知道这是不是COFF格式的原型?)
ifndef ??version
?debug macro
endm
endif
?debug S "test.c"
_TEXT segment byte public 'CODE'
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP,ss:DGROUP
_TEXT ends
_DATA segment word public 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public 'BSS'
b@ label byte
b@w label word
?debug C E9CE99B43E06746573742E63
_BSS ends
_DATA segment word public 'DATA'
_DATA ends
_TEXT segment byte public 'CODE'
; ?debug L 3
_main proc near
push si
; ?debug L 7
mov ax,25
push ax ;第二个25入栈
mov ax,25
push ax ;第一个25入栈
call near ptr _SUM
pop cx
pop cx
mov si,ax
; ?debug L 9
push si
mov ax,offset DGROUP:s@
push ax
call near ptr _printf
pop cx
pop cx
@1:
; ?debug L 12
pop si
ret
_main endp
_TEXT ends
?debug C E9
_DATA segment word public 'DATA'
s@ label byte
db 105
db 61
db 37
db 100
db 10
db 0
_DATA ends
_TEXT segment byte public 'CODE'
extrn _printf:near
extrn _SUM:near
_TEXT ends
public _main
end
到底怎样才能在WINDOWS平台上连接成功?实现输出50的简单功能??
解决后加分!!!
展开
 我来答
百度网友109d3f065
2011-05-21 · TA获得超过167个赞
知道小有建树答主
回答量:471
采纳率:0%
帮助的人:203万
展开全部
是因为你的c语言编译器是 32 位的 ,而你的汇编语言是 16 位的 ,连接当然有问题,就算没问题也是运行不起来的。

建议你换一个 32 位的汇编编译器 且用32位汇编指令编写 , 不过你得重新学一下 32位的汇编。

另外还有一种方法就是 使用VC 编写C语言 , 在C中直接用内联汇编。代码如下

__stdcall int fun()
{
int a;
__asm{
mov eax, [esi+4];
add eax, [esi+6];

mov a , eax;
}
return a;
}
int main(int argc, char* argv[])
{
printf("Hello World!\n");

printf("%d\n",fun());
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式