C语言中插入汇编语言
网上的搜集,不一定可用
#include "stdio.h"
void main()
{
int a,b,c;
a=3;
b=4;
__asm
{
mov eax,a
mov ebx,b
add eax,ebx
mov c,eax
}
printf("c is %d\n", c);
}
GCC中插入汇编语言
int main(int argc,char **argv)
{
int a=10,b=20;
int c=0;
asm("movl %1,%%eax;\
addl %2,%%eax;\
movl %%eax,%0;"
:"=m"(c)
:"r"(a),"r"(b)
:"%eax");
printf("a+b=%d",c);
return 1;
}
complier this one :
gcc add.c -o add
这两个都正确,前者是vc里的嵌入汇编,功能较弱
的汇编。
后者是gcc的嵌入汇编,可以实现32位汇编,功能很强大。
后一个程序是求c=a+b 的值。
那段嵌入代码会扩展成与以下代码等价的东西:
movl $a,%eax
addl $b,%eax
movl %eax,$c
你可以使用下面的编译指令生成汇编文件add.s
gcc -S add.cTop
开dos控制台部分汇编实现。
#include <windows.h>
#include <winbase.h>
void main()
{
LoadLibrary("msvcrt.dll");
__asm {
mov esp,ebp ;把ebp的内容赋值给esp
push ebp ;保存ebp,esp-4
mov ebp,esp ;给ebp赋新值,将作为局部变量的基指针
xor edi,edi ;
push edi ;压入0,esp-4,;作用是构造字符串的结尾\0字符。
sub esp,08h ;加上上面,一共有12个字节,;用来放"command.com"。
mov byte ptr [ebp-0ch],63h ;
mov byte ptr [ebp-0bh],6fh ;
mov byte ptr [ebp-0ah],6dh ;
mov byte ptr [ebp-09h],6Dh ;
mov byte ptr [ebp-08h],61h ;
mov byte ptr [ebp-07h],6eh ;
mov byte ptr [ebp-06h],64h ;
mov byte ptr [ebp-05h],2Eh ;
mov byte ptr [ebp-04h],63h ;
mov byte ptr [ebp-03h],6fh ;
mov byte ptr [ebp-02h],6dh ;生成串"command.com".
lea eax,[ebp-0ch] ;
push eax ;串地址作为参数入栈
mov eax, 0x7801AFC3 ;
call eax ;调用system
}
}
直接编译看看吧。给你一个上来就可以玩转的源码PP嘻嘻,注释加的多好啊

2008年11月26日 13:23
"GCC中插入汇编语言" 这段代码中的
:"=m"(c), // 多了一个逗号
2008年12月08日 11:21
Thanks,已修改。