用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;
}

 

你可能感兴趣的:(例子)