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