在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)

今天有点时间,重新改下了下,为避免因编译器和平台实现而出现的问题,我写了三个版本,分别是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;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-07-23
上面的仁兄 mian()不是在吗,你没看到?

VC 是可以嵌入汇编,可是你嵌入的是一个完整的汇编程序,这有些不合理吧. 试想,如果可以嵌入完整的汇编程序,那 VC 岂不是可以叫 VA(Visual Asm)了:) 你把那些定义段的伪代码去掉,然后将变量定义放在 __asm{} 前面(嵌入代码可以访问到这些变量的).然后再编译,应该没问题了:)
在VC中嵌入汇编,只需在
_asm
{
加入实现应用的汇编代码。
}
就行了。
第2个回答  2019-02-23
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;
}
}
第3个回答  2007-07-23
__asm{

汇编代码

}
例如a+b程序
int main()
{
int a,b;
__asm{
mov a , eax
add b , eax
mov eax , a
}
return 0;
}
第4个回答  2007-07-23
我不知道你的测试是干什么用的。
但是想要提高效率。你可以试着把scanf和printf都改为用文件输入输出。你scanf不会是用手输入的吧?估计是在一个文件中准备的数据。
相似回答