在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的简单功能??
解决后加分!!! 展开
/*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的简单功能??
解决后加分!!! 展开
1个回答
展开全部
是因为你的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;
}
建议你换一个 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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询