在c语言(C++或G++)中如何嵌入汇编
要求不断输入一个整数A,输出整数A-1,如果A为0就停止.由于测试数据的数量非常大,运行起来很慢.请问怎么在C中嵌套汇编来大大加大效率,编译器是C++或G++.最好给一小...
要求不断输入一个整数A,输出整数A-1,如果A为0就停止.由于测试数据的数量非常大,运行起来很慢.请问怎么在C中嵌套汇编来大大加大效率,编译器是C++或G++.最好给一小段代码样例,我嵌套汇编总是编译错误.谢谢各位牛人了.
我写了个C语言的例子,要求嵌套汇编后功能不能变.
如果输入输出都用汇编就更好了.(必须要VC++6.0编译运行才可以,LINUX的G++编译运行也可以)
#include <stdio.h>
int main()
{
int n;
while(scanf("%d",&n)==1)
{
if(n==0)
break;
printf("%d\n",n-1);
}
return 0;
}
我看好象嵌套了汇编效率会提高3倍到5倍左右.
如果可以,请给一小段代码样例(用我写的小C程序改下就可以了.)(读文件行不通哈.因为大量数据测试本来就会用到文件输入输出.我要的是提高效率但不通过改程序方法,只改语言.)
最好请用VC++6.0编译通过...运行输入1000000输出答案是不是999999.请不要给运行错误的答案..(范围是INT) 展开
我写了个C语言的例子,要求嵌套汇编后功能不能变.
如果输入输出都用汇编就更好了.(必须要VC++6.0编译运行才可以,LINUX的G++编译运行也可以)
#include <stdio.h>
int main()
{
int n;
while(scanf("%d",&n)==1)
{
if(n==0)
break;
printf("%d\n",n-1);
}
return 0;
}
我看好象嵌套了汇编效率会提高3倍到5倍左右.
如果可以,请给一小段代码样例(用我写的小C程序改下就可以了.)(读文件行不通哈.因为大量数据测试本来就会用到文件输入输出.我要的是提高效率但不通过改程序方法,只改语言.)
最好请用VC++6.0编译通过...运行输入1000000输出答案是不是999999.请不要给运行错误的答案..(范围是INT) 展开
10个回答
展开全部
今天有点时间,重新改下了下,为避免因编译器和平台实现而出现的问题,我写了三个版本,分别是windows下vc6.0,windows下mingw和cygwin和linux下的gcc/g++。
vc6.0:
#include <stdio.h>
const char* input = "%d";
const char* output = "%d\n";
int n;
int main()
{
__asm
{
lea eax, n
push eax
push input
loopx:
call scanf
cmp eax, 1
jne end
mov ecx, n
jecxz end
dec ecx
push ecx
push output
call printf
add esp, 8
jmp loopx
end:
add esp, 8
}
return 0;
}
mingw/cygwin:
#include <stdio.h>
const char* input = "%d";
const char* output = "%d\n";
int n;
int main()
{
__asm__
(
"loop: \n"
"pushl $_n \n"
"pushl _input \n"
"call _scanf \n"
"addl $8, %esp \n"
"cmpl $1, %eax \n"
"jne end \n"
"movl _n, %ecx \n"
"jecxz end \n"
"decl %ecx \n"
"pushl %ecx \n"
"pushl _output \n"
"call _printf \n"
"addl $8, %esp \n"
"jmp loop \n"
"end:"
);
return 0;
}
linux gcc/g++:
#include <stdio.h>
const char* input = "%d";
const char* output = "%d\n";
int n;
int main()
{
__asm__
(
"pushl $n \n"
"pushl input \n"
"loop: \n"
"call scanf \n"
"cmp $1, %eax \n"
"jne end \n"
"movl n, %ecx \n"
"jecxz end \n"
"decl %ecx \n"
"pushl %ecx \n"
"pushl output \n"
"call printf \n"
"addl $8, %esp \n"
"jmp loop \n"
"end: \n"
"addl $8, %esp \n");
return 0;
}
vc6.0:
#include <stdio.h>
const char* input = "%d";
const char* output = "%d\n";
int n;
int main()
{
__asm
{
lea eax, n
push eax
push input
loopx:
call scanf
cmp eax, 1
jne end
mov ecx, n
jecxz end
dec ecx
push ecx
push output
call printf
add esp, 8
jmp loopx
end:
add esp, 8
}
return 0;
}
mingw/cygwin:
#include <stdio.h>
const char* input = "%d";
const char* output = "%d\n";
int n;
int main()
{
__asm__
(
"loop: \n"
"pushl $_n \n"
"pushl _input \n"
"call _scanf \n"
"addl $8, %esp \n"
"cmpl $1, %eax \n"
"jne end \n"
"movl _n, %ecx \n"
"jecxz end \n"
"decl %ecx \n"
"pushl %ecx \n"
"pushl _output \n"
"call _printf \n"
"addl $8, %esp \n"
"jmp loop \n"
"end:"
);
return 0;
}
linux gcc/g++:
#include <stdio.h>
const char* input = "%d";
const char* output = "%d\n";
int n;
int main()
{
__asm__
(
"pushl $n \n"
"pushl input \n"
"loop: \n"
"call scanf \n"
"cmp $1, %eax \n"
"jne end \n"
"movl n, %ecx \n"
"jecxz end \n"
"decl %ecx \n"
"pushl %ecx \n"
"pushl output \n"
"call printf \n"
"addl $8, %esp \n"
"jmp loop \n"
"end: \n"
"addl $8, %esp \n");
return 0;
}
展开全部
上面的仁兄 mian()不是在吗,你没看到?
VC 是可以嵌入汇编,可是你嵌入的是一个完整的汇编程序,这有些不合理吧. 试想,如果可以嵌入完整的汇编程序,那 VC 岂不是可以叫 VA(Visual Asm)了:) 你把那些定义段的伪代码去掉,然后将变量定义放在 __asm{} 前面(嵌入代码可以访问到这些变量的).然后再编译,应该没问题了:)
在VC中嵌入汇编,只需在
_asm
{
加入实现应用的汇编代码。
}
就行了。
VC 是可以嵌入汇编,可是你嵌入的是一个完整的汇编程序,这有些不合理吧. 试想,如果可以嵌入完整的汇编程序,那 VC 岂不是可以叫 VA(Visual Asm)了:) 你把那些定义段的伪代码去掉,然后将变量定义放在 __asm{} 前面(嵌入代码可以访问到这些变量的).然后再编译,应该没问题了:)
在VC中嵌入汇编,只需在
_asm
{
加入实现应用的汇编代码。
}
就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言中嵌入汇编的方法是加入关键字“asm”来实现的,如:
例1:
main()
{
asm
mov
ah,2;
asm
mov
bh,0;
asm
mov
dl,
20;
asm
mov
dh,10;
asm
int
10h;
}
例2:
main()
{
asm{
mov
ah,2;
mov
bh,0;
mov
dl,
20;
mov
dh,10;
int
10h;
}
}
例1:
main()
{
asm
mov
ah,2;
asm
mov
bh,0;
asm
mov
dl,
20;
asm
mov
dh,10;
asm
int
10h;
}
例2:
main()
{
asm{
mov
ah,2;
mov
bh,0;
mov
dl,
20;
mov
dh,10;
int
10h;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
__asm{
汇编代码
}
例如a+b程序
int main()
{
int a,b;
__asm{
mov a , eax
add b , eax
mov eax , a
}
return 0;
}
汇编代码
}
例如a+b程序
int main()
{
int a,b;
__asm{
mov a , eax
add b , eax
mov eax , a
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我不知道你的测试是干什么用的。
但是想要提高效率。你可以试着把scanf和printf都改为用文件输入输出。你scanf不会是用手输入的吧?估计是在一个文件中准备的数据。
但是想要提高效率。你可以试着把scanf和printf都改为用文件输入输出。你scanf不会是用手输入的吧?估计是在一个文件中准备的数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询