嵌入在VC函数的一段汇编程序只能在WIN98下运行,如何修改代码转到WINXP下运行?

[复制链接]
查看11 | 回复9 | 2021-1-27 06:05:17 | 显示全部楼层 |阅读模式
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下运行呢?盼高人指点,非常感谢!

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
driver
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
winiolibrary
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
试一下movax,[yourvar]这种格式,,如果是用VS2008的嵌入的话应该没有问题,我经常写嵌入汇编,但没有遇到你这咱情况,现在不用WIN系统了,所以我只能口头表达一下了。。。
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
不明白楼主为什么写混合代码。前几行是16位代码,后几行是32位代码。楼主的程序应该是运行在32位windows环境,为什么不写成纯32位的呢?
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
你的需求有问题,重新设计。
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
感谢各位的热心解答。
Mydo所提的需求问题是指?
我的需求很简单,就是希望能将上述函数实现的功能移植到XP下运行,原来的代码只能在WIN98
下运行。
补充说明:这段代码是基于插在PC的PCI插槽内的PCI卡进行对PCI控制的外部Memory的连续写
控制,而PCI卡本身有对应的XP下的驱动程序,且bigwatercar所提出的winiolibrary,我有使用,但似乎只能解决I/O读写的问题,不能解决上述函数实现的对外部Memory的读写。
是否是PCI卡本身有对应的XP下的驱动程序需要重新修改?从而支持这种对外设的Memory的连续读写?
盼大家能继续解答,谢谢!
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
9x下可以直接访问端口,但NT下不行,你可以利用driver来完成功能。
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
写驱动映射内核内存到用户内存
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
你这个功能貌似就是memcpy吧,C语言函数就是默认的CS,DS,ES都是一个选择子。那你加载SEGREG干嘛,不知道你要干嘛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行