用VC做内联汇编的例子

汇编很重要,C很方便,所以内联汇编很重要,哈哈哈,下面是自己写的示例代码 
代码
#include <iostream.h>
#include 
<windows.h>
//汇编写函数
int jia(int add1,int add2)//普通函数
{
    _asm
    {
        mov eax,add1
        mov ebx,add2
        add eax,ebx
    }
}
//naked函数
//汇编写函数
char tt[]="eee";
void main()
{
    
//代码重定位
    DWORD p;
    _asm
    {
        call la
la:
        pop eax
        mov p,eax
    }
    
    
//::MessageBox(0,"err","err",MB_OK);
    
//代码重定位
    
//获得变量的地址
    int i=0x20;
    _asm
    {
        mov eax,offset tt;
//全局变量用OFFSET
        lea eax,i//局部变量用lea
    }
    
//获得变量的地址
    
//函数调用
    char cap[]="cap";
    
char nr[]="mess";
    _asm
    {
        push MB_OK
        lea eax,cap
        push eax
        lea eax,nr
        push eax
        push 
0
        
//call dword ptr [MessageBox]
        add esp,16
    }
    
//函数调用
    
//调用汇编函数
    int re;
    re
=jia(1,4);
    cout
<<re<<endl;
    
//调用汇编函数
    cout<<hex<<p<<endl;
    _asm
    {
        push eax
        push ebx
        call lb
lb:
        pop eax
        mov p,eax
        mov eax,
0x401176
        mov ebx,dword ptr [eax]
        
//不能用mov ebx,[0x401176],奇怪
        and ebx,0
        mov bx,
0x1111
        
//访问高16位用移位指令
        mov bx,0x1001
        rol ebx,
16
        mov bx,
0x1111
        pop eax
        pop ebx
    }
    cout
<<hex<<p<<endl;
    
//花指令
    _asm
    {
        pushad
        call lc
lc:
        pop eax
        mov p,eax
        mov eax,
1
        test eax,eax
        jnz n
        jz y
y:
        _EMIT 0e8h
//书上抄的花指令:)    
n:
        mov eax,
0x11111111
    }
    cout
<<hex<<p<<endl;
}

 

posted @ 2010-04-19 17:12  认真做人,认真做事  阅读(594)  评论(0编辑  收藏  举报