关于在vc里c和汇编的混合编程

时间:2021-04-04 01:11:29
帮我看看:

--------------------Configuration: 12 - Win32 Debug--------------------
Performing Custom Build Step on .\1.asm
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993.  All rights reserved.
warning A4017: invalid command-line option : /nologo/c/coff
 Assembling: .\1.asm
Invalid keyboard code specified
Microsoft (R) Segmented Executable Linker  Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992.  All rights reserved.
Object Modules [.obj]: 1.obj 
Run File [1.exe]: "1.exe"
List File [nul.map]: NUL
Libraries [.lib]: 
Definitions File [nul.def]: 
LINK : warning L4021: no stack segment
LINK : warning L4038: program has no starting address
Compiling...
2.C
Linking...
Invalid keyboard code specified
Microsoft (R) Segmented Executable Linker  Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992.  All rights reserved.
LINK : fatal error L1022: response line too long
Error executing link.exe.

12.exe - 1 error(s), 3 warning(s)

14 个解决方案

#1


up

#2


用VC内嵌汇编

#3


ML是32位的
LINK是16位的??

#4


贴出来好吗,一起分析一下,呵呵

#5


是啊,拿出来,大家一起看看吧!

#6


这是一个同学问我的,主要是用汇编实现一个排序的子程序,然后在c里面调用该函数。
/*************************************************/
/******2.c文件<我在vc编译的,但是文件是.c的*******/
/*************************************************/

#include<stdio.h>
extern void sort2(int array[]);

void sort1 (int array[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++) {
k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k]) k=j;
t=array[k];array[k]=array[i];array[i]=t;}
}

main()
{
int a[10],i;
printf("Please enter the first array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort1(a,10);
printf("the sorted array:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n ");

printf("Please enter the second array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort2(a);
printf("using asm,the sorted array\n :");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n ");
}

/**************************************************/
下面的是汇编程序《我觉得程序是没问题的了》
.MODEL        SMALL ,C
.CODE
       PUBLIC  _SORT2
 
       _SORT2  PROC      NEAR
              PUSH      SI
              PUSH      BX
               PUSH      AX
             PUSH      DI
               MOV       CX,10
              MOV       SI,SP
       LOOP1:
               MOV       DI,CX
               MOV       BX,0
       LOOP2:
               MOV       AX,[BX+SI]
               CMP       AX,[BX+SI+2]
               JGE       CONTINUE
               XCHG      AX,[BX+SI+2]
               MOV       [BX+SI],AX
    CONTINUE:
               ADD       BX,2
               LOOP      LOOP2
               MOV       CX,DI
               LOOP      LOOP1
               POP       DI
               POP       AX
               POP       BX
               POP       SI
               RET
       _SORT2  ENDP
               END

 }

#7


我是在vc下编译的
我把汇编的函数的文件1.asm添加到文件2.c所在的工程里面。
然后设置1.asm的自定义编译:
命令:ML.exe /nologo /c "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)"
输出:$(IntDir)\$(InputName).obj
编译结果:
Deleting intermediate files and output files for project '12 - Win32 Debug'.
--------------------Configuration: 12 - Win32 Debug--------------------
Performing Custom Build Step on .\1.asm
 Assembling: .\1.asm
Compiling...
2.C
Linking...
Invalid keyboard code specified
Microsoft (R) Segmented Executable Linker  Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992.  All rights reserved.
LINK : fatal error L1022: response line too long
Error executing link.exe.

12.exe - 1 error(s), 0 warning(s)
************************************************
这个什么意思:
LINK : fatal error L1022: response line too long

#8


帮你UP!

#9


.c输出的是32位目标码
.asm输出的是16位的目标码

所以......

#10


WIN32 要用 .model flat

#11


汇编代码有些问题的. 首先 SORT2 应该是 sort2, 而且编译时还要加上保持大小写状态的选项. 如果是用 Masm6.x 编译的话, 由于 .model c 的缘故, 前面不能有下划线的, 否则最后就成了 __sort2, 前面有两个下划线. 
             MOV       SI,SP
       LOOP1:
               MOV       DI,CX
               MOV       BX,0
       LOOP2:
               MOV       AX,[BX+SI]
...
这里的 SI 并没有能指向那个数组, 应该是:  mov  si, [sp+0ah] , 但 sp 不被支持间接寻址的, 所以一般是使用用 bp, 这样的话, 那个 0ah 可能还需要再调整

#12


可是还是不行啊。
************************************************
这个什么意思:
LINK : fatal error L1022: response line too long

#13


"如果是用 Masm6.x 编译的话, 由于 .model c 的缘故, 前面不能有下划线的, 否则最后就成了 __sort2, 前面有两个下划线. "  是对的

#14


win32 程序只有一种内存模式,就是flat模式,你用small模式怎么行??

#1


up

#2


用VC内嵌汇编

#3


ML是32位的
LINK是16位的??

#4


贴出来好吗,一起分析一下,呵呵

#5


是啊,拿出来,大家一起看看吧!

#6


这是一个同学问我的,主要是用汇编实现一个排序的子程序,然后在c里面调用该函数。
/*************************************************/
/******2.c文件<我在vc编译的,但是文件是.c的*******/
/*************************************************/

#include<stdio.h>
extern void sort2(int array[]);

void sort1 (int array[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++) {
k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k]) k=j;
t=array[k];array[k]=array[i];array[i]=t;}
}

main()
{
int a[10],i;
printf("Please enter the first array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort1(a,10);
printf("the sorted array:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n ");

printf("Please enter the second array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort2(a);
printf("using asm,the sorted array\n :");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n ");
}

/**************************************************/
下面的是汇编程序《我觉得程序是没问题的了》
.MODEL        SMALL ,C
.CODE
       PUBLIC  _SORT2
 
       _SORT2  PROC      NEAR
              PUSH      SI
              PUSH      BX
               PUSH      AX
             PUSH      DI
               MOV       CX,10
              MOV       SI,SP
       LOOP1:
               MOV       DI,CX
               MOV       BX,0
       LOOP2:
               MOV       AX,[BX+SI]
               CMP       AX,[BX+SI+2]
               JGE       CONTINUE
               XCHG      AX,[BX+SI+2]
               MOV       [BX+SI],AX
    CONTINUE:
               ADD       BX,2
               LOOP      LOOP2
               MOV       CX,DI
               LOOP      LOOP1
               POP       DI
               POP       AX
               POP       BX
               POP       SI
               RET
       _SORT2  ENDP
               END

 }

#7


我是在vc下编译的
我把汇编的函数的文件1.asm添加到文件2.c所在的工程里面。
然后设置1.asm的自定义编译:
命令:ML.exe /nologo /c "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)"
输出:$(IntDir)\$(InputName).obj
编译结果:
Deleting intermediate files and output files for project '12 - Win32 Debug'.
--------------------Configuration: 12 - Win32 Debug--------------------
Performing Custom Build Step on .\1.asm
 Assembling: .\1.asm
Compiling...
2.C
Linking...
Invalid keyboard code specified
Microsoft (R) Segmented Executable Linker  Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992.  All rights reserved.
LINK : fatal error L1022: response line too long
Error executing link.exe.

12.exe - 1 error(s), 0 warning(s)
************************************************
这个什么意思:
LINK : fatal error L1022: response line too long

#8


帮你UP!

#9


.c输出的是32位目标码
.asm输出的是16位的目标码

所以......

#10


WIN32 要用 .model flat

#11


汇编代码有些问题的. 首先 SORT2 应该是 sort2, 而且编译时还要加上保持大小写状态的选项. 如果是用 Masm6.x 编译的话, 由于 .model c 的缘故, 前面不能有下划线的, 否则最后就成了 __sort2, 前面有两个下划线. 
             MOV       SI,SP
       LOOP1:
               MOV       DI,CX
               MOV       BX,0
       LOOP2:
               MOV       AX,[BX+SI]
...
这里的 SI 并没有能指向那个数组, 应该是:  mov  si, [sp+0ah] , 但 sp 不被支持间接寻址的, 所以一般是使用用 bp, 这样的话, 那个 0ah 可能还需要再调整

#12


可是还是不行啊。
************************************************
这个什么意思:
LINK : fatal error L1022: response line too long

#13


"如果是用 Masm6.x 编译的话, 由于 .model c 的缘故, 前面不能有下划线的, 否则最后就成了 __sort2, 前面有两个下划线. "  是对的

#14


win32 程序只有一种内存模式,就是flat模式,你用small模式怎么行??