voidCTest::Write(LPDWORDlpSrc,WORDwDwordCount)
{
WORDwIOSelector;//16BITS
wIOSelector=wSelector;
if(wIOSelector)
{
__asm{
pusha
pushes
movax,wIOSelector
moves,ax//winxp:accessviolation
movecx,0
movcx,wDwordCount//Counter设置
movesi,lpSrc//esi,源变址寄存器
movedi,0//edi,目的变址寄存器,
//寄存器ESI、EDI、SI和DI称为变址寄存器(IndexRegister),它们主要用于存放存储单元
//在段内的偏移量
cld//cld是清除方向标志,
//cld在字符串的比较、赋值、读取等一系列和rep连用的操作中,di或si是可以自动增减的
而不需要人来加减它的值,
//cld即告诉程序si,di向前移动.
repmovsd//传送wDwordCount个DWORD,从ds:lpsrc到wIOSelector,即将数据段寄存器DS:[esi]的值装
//入附加段寄存器ES:[edi].
//此处表示每次传送1个DWORD后,esi=esi+sizeof(DWORD),edi=edi+sizeof(DWORD),
//ecx=ecx-1;
popes
popa
}
}
};
说明:
这段程序在98下可以运行,在XP下编译也可以通过,但运行时在:moves,ax这一行会提示:Accessviolation,查了一些资料说是在WIN32下无法对段寄存器直接赋值,修改段寄存器需要内核级权限。
那这段代码,我应该如何修改才能转到XP下运行呢?盼高人指点,非常感谢!
分 -->
|