Ted's Blog

Happy coding

C语言中插入汇编语言

Ted posted @ 2008年10月28日 01:31 in c with tags ASM c , 4679 阅读

网上的搜集,不一定可用

#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嘻嘻,注释加的多好啊

Avatar_small
Blue++ 说:
2008年11月26日 21:23

"GCC中插入汇编语言" 这段代码中的
:"=m"(c), // 多了一个逗号


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter