标题: 轩辕春秋版引擎整型变量被突然清零的诡异问题, 与正在开发中的MOD有关,急需高手解决
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-14 23:06 资料 个人空间 短消息 只看该作者
轩辕春秋版引擎整型变量被突然清零的诡异问题

我采用轩辕春秋版引擎开发MOD时,偶尔会出现整形变量被突然清零的奇怪问题。

比如,原来一个整型变量a明明不等于0,但游戏进行一段时间(不知道和存档/读档是否有关)这个变量a的值就突然成了0了。
我在这一段的剧本中肯定没有采用“77 变量运算”或“78 整型变量赋值”指令对其进行任何操作的,是它自己自动变成0了。

个人感觉应该是exe的问题,但不知道是本身就有的问题还是我对exe修改后造成的问题。我做的修改都是严格按照《曹操传exe修改详解》一文来的,应该不会造成这种问题啊。

虽然问题出现具有很大偶然性,但对于开发一部完整MOD而言是致命的缺陷。不知道还有没有使用轩辕春秋引擎的朋友遇到过类似的问题。

问题原因可能比较复杂,请各位牛人帮忙解决一下吧,真是太感激了!

[ 本帖最后由 赵辉 于 2009-9-14 23:17 编辑 ]


顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-14 23:16 资料 个人空间 短消息 只看该作者
问题的例子

附件所示就是一例:

我在前一R剧本中用78“整形变量赋值”指令将短枪的等级赋给整型变量222,这时短枪肯定是1级以上的。
而在后一剧本中再将整型变量222的值赋回去。
中间对整型变量222没做其它任何事,可它不知如何就变成0了,导致赋回去的短枪的等级也成了0。

真是太奇怪了!!


图片附件: [问题图片] 未命名.JPG (2009-9-14 23:16, 8.78 K)



顶部
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2009-9-14 23:26 资料 个人空间 短消息 只看该作者
检查一下是否漏了Sv00b.e5s--Sv09b.e5s这十个新增的存档文件,如果没有漏就上传EXE和相关剧本。
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-14 23:46 资料 个人空间 短消息 只看该作者
新增的10个存档我没有漏的。

我已经初步判定是a"初始化局部变量"这条指令将整型变量222清0的,但它前后的整型变量都没有受到影响。
按理来说a指令应该只管255以前的bool型变量吧。

希望上述信息对您解决问题有所帮助

附件是我的exe,以及剧本、剧本前的存档



[ 本帖最后由 赵辉 于 2009-9-15 00:45 编辑 ]


附件: [exe] ekd5.rar (2009-9-14 23:46, 213.83 K)
该附件被下载次数 148


附件: 剧本及剧本前的存档.rar (2009-9-14 23:49, 10.26 K)
该附件被下载次数 150
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-14 23:50 资料 个人空间 短消息 只看该作者
回复 #3 godtype 的帖子

您可以试试看,剧本本身并没有特别的,但只要在剧本开头加上a指令,整222就会变成0,而在原来存档里是2。
不加a指令的话整222仍然是2
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 07:37 资料 个人空间 短消息 只看该作者
能不能请参与过轩辕春秋引擎制作的哪位大人提供一下a “初始化局部变量”指令在exe中对应代码段的位置。

鄙人也粗通汇编语言,了解一些调试技术。也许你们提供的信息可以让我发现问题也说不定。

谢谢!
顶部
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2009-9-15 07:42 资料 个人空间 短消息 只看该作者
将A1C66的04改成03试一下,EXE我就不上传了。
顶部
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2009-9-15 07:44 资料 个人空间 短消息 只看该作者
回复 #6 赵辉 的帖子

A在415AD7。

PS:如果懂汇编,其实可以自己找到的,翻一下岱瀛的精华帖,有一帖就谈到剧本指令的。
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 08:26 资料 个人空间 短消息 只看该作者
回复 #7 godtype 的帖子

好像还是有问题。

我用Ollydbg调试发现修改了整222所在内存单元的是这段代码:
004D0C5D    B9 00A45500     MOV ECX,ekd5.0055A400
004D0C62    EB 07           JMP SHORT ekd5.004D0C6B
004D0C64    3D 00040000     CMP EAX,400
004D0C69    73 0D           JNB SHORT ekd5.004D0C78
004D0C6B    C701 00000000   MOV DWORD PTR DS:[ECX],0
004D0C71    83C0 04         ADD EAX,4
004D0C74    03C8            ADD ECX,EAX
004D0C76  ^ EB EC           JMP SHORT ekd5.004D0C64
应该是a指令调用的这段代码吧。
您看看是不是可以从这里入手。

顶部
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2009-9-15 08:38 资料 个人空间 短消息 只看该作者
就是这句多了100
004D0C64   3D 00040000      CMP EAX,400
改回到CMP EAX,300即可,55A400--55AFFF都会清0,如果是400,会将后面55B000--55B3FF也都清了,这些都是前面的256个整形变量。
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 08:55 资料 个人空间 短消息 只看该作者
回复 #10 godtype 的帖子

啊,我才发现您改A1C66实际改的就是那里。

可改过以后还是有问题:

当EAX=B0时,ECX=55B378,
执行MOV DWORD PTR DS:[ECX],0这条指令就把整222清0了。
此时EAX还未超过300,所以还会继续执行的。

对004D0C71    83C0 04         ADD EAX,4
004D0C74    03C8            ADD ECX,EAX
这两条指令有点不解,既然是逐个将局部变量清0,应该是直接对计数器ECX做累加啊,局部变量的地址应该是相邻的吧,为什么对EAX+4,ECX再+EAX呢,这样的话不是两次执行
MOV DWORD PTR DS:[ECX],0
的ECX之间会相差很远吗?是不是这里的问题呢?
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 09:01 资料 个人空间 短消息 只看该作者
回复 #10 godtype 的帖子

另外问一下您:
1个bool型局部变量不是就占1字节吗(高级语言是这样的,不知道这个exe里是不是),而局部变量应该只有256个,为什么要将55A400--55AFFF都这段空间都清0呢?

为我的exe真是辛苦您了,希望问题能得到圆满解决啊。
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 09:02 资料 个人空间 短消息 只看该作者
回复 #10 godtype 的帖子

我刚研究了一下,bool型局部变量,大致是在492FF4开始的空间内,每4字节1个。
那么55A400开始的那部分又是什么呢?应该没有整型局部变量吧,岱瀛大人只说提供4K个全局整型变量和1K个全局指针变量的。

所以更加不明白004D0C5D地址开始的这段代码在做什么了。
不过我想不管它做什么,让它不影响55b000开头的全局整型变量就可以了吧。

不知版主大人认为我说得对不对。

[ 本帖最后由 赵辉 于 2009-9-15 09:35 编辑 ]
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 10:08 资料 个人空间 短消息 只看该作者
目前我想到的一个解决方案:
在您将400改为300的基础上,将原来代码:
004D0C5D    B9 00A45500     MOV ECX,ekd5.0055A400
004D0C62    EB 07           JMP SHORT ekd5.004D0C6B
004D0C64    3D 00040000     CMP EAX,400
004D0C69    73 0D           JNB SHORT ekd5.004D0C78
004D0C6B    C701 00000000   MOV DWORD PTR DS:[ECX],0
004D0C71    83C0 04         ADD EAX,4
004D0C74    03C8            ADD ECX,EAX
004D0C76  ^ EB EC           JMP SHORT ekd5.004D0C64
004D0C78    B8 01000000     MOV EAX,1
004D0C7D  - E9 894EF4FF     JMP ekd5.00415B0B
004D0C82    90              NOP
修改成:
004D0C5D    B9 00A45500     MOV ECX,ekd5.0055A400
004D0C62    EB 07           JMP SHORT ekd5.004D0C6B
004D0C64    3D 00030000     CMP EAX,300
004D0C69    73 0E           JNB SHORT ekd5.004D0C79
004D0C6B    C701 00000000   MOV DWORD PTR DS:[ECX],0
004D0C71    83C0 04         ADD EAX,4
004D0C74    83C1 04         ADD ECX,4
004D0C77  ^ EB EB           JMP SHORT ekd5.004D0C64
004D0C79    B8 01000000     MOV EAX,1
004D0C7E  - E9 884EF4FF     JMP ekd5.00415B0B
这样就可以保证该段只对55A400-55AFFF进行清0,而不影响后面的整型变量。
(因为ADD ECX,4比ADD ECX,EAX多1字节,还好4D0C82 位置有个NOP,要不还得使用exe的其它空白区

我拿原剧本测试,看来问题解决了。但就是不知这样一来会不会引发别的问题。

我先这么试试看吧,要是再有问题再来请教版主大人。
如果版主大人发现了更好的解决方案,请不吝指教

再次向您表示衷心的感谢!我会将您列入我MOD的致谢名单的


[ 本帖最后由 赵辉 于 2009-9-15 10:12 编辑 ]
顶部
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2009-9-15 10:19 资料 个人空间 短消息 只看该作者
刚才下线了,现在才回来看帖。
可以参考一下STAR175的引擎代码,毕竟岱瀛的这个EXE是在瓦岗的基础上改的,很多地方未必通用:
00415ACC  /. 55               PUSH EBP
00415ACD  |. 8BEC             MOV EBP,ESP
00415ACF  |. 51               PUSH ECX
00415AD0  |. 33C9             XOR ECX,ECX
00415AD2  |. 894D FC          MOV DWORD PTR SS:[EBP-4],ECX
00415AD5  |. EB 09            JMP SHORT 00415AE0
00415AD7  |> 8B45 FC          /MOV EAX,DWORD PTR SS:[EBP-4]
00415ADA  |. 83C0 01          |ADD EAX,1
00415ADD  |. 8945 FC          |MOV DWORD PTR SS:[EBP-4],EAX
00415AE0  |> 66:817D FC 0001   CMP WORD PTR SS:[EBP-4],100
00415AE6  |. 73 0F            |JNB SHORT 00415AF7
00415AE8  |. 6A 00            |PUSH 0
00415AEA  |. FF75 FC          |PUSH DWORD PTR SS:[EBP-4]
00415AED  |. 8B4D 08          |MOV ECX,DWORD PTR SS:[EBP+8]
00415AF0  |. E8 DC290000      |CALL 004184D1
00415AF5  |.^EB E0            \JMP SHORT 00415AD7
00415AF7  |> 33C0             XOR EAX,EAX
00415AF9  |. B9 00145000      MOV ECX,00501400  ——相当于岱的55A400
00415AFE  |. EB 07            JMP SHORT 00415B07
00415B00  |> 3D 00030000      /CMP EAX,300
00415B05  |. 73 0E            |JNB SHORT 00415B15
00415B07  |> C701 00000000     MOV DWORD PTR DS:[ECX],0
00415B0D  |. 83C0 01          |ADD EAX,1
00415B10  |. 83C1 04          |ADD ECX,4
00415B13  |.^EB EB            \JMP SHORT 00415B00
00415B15  |> B8 01000000      MOV EAX,1
00415B1A  |. 8BE5             MOV ESP,EBP
00415B1C  |. 5D               POP EBP
00415B1D  \. C3               RETN
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 11:00 资料 个人空间 短消息 只看该作者
看来还真的是ADD ECX,EAX的问题。
对,应该是ADD EAX,1 而不是ADD EAX,4,这点我忽略了,因为是300*4字节

不知道是我这1个exe的问题还是轩辕春秋引擎一直就有这个问题,或者是什么时候发过修正补丁而我没有注意到。

如果本来就有此问题的话,还麻烦版主大人和岱瀛大人他们说一下(或者您自己负责也行),发个修正,方便尚在使用轩辕引擎的朋友们解决此问题。

再次向您致谢!
顶部
性别:未知-离线 showzhuge
(诸葛宿)

★★

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 破虏将军
功绩 28
帖子 760
编号 81273
注册 2006-9-1


发表于 2009-9-15 13:34 资料 文集 短消息 只看该作者
如果整型变量不是太多 推荐一些关键变量可以不加入武将的五围和能力值来暂存
顶部
性别:男-离线 赵辉
(长平)

昭信伯
安德军节度使
★★★★

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 节度使
级别 右将军
好贴 2
功绩 361
帖子 1092
编号 338625
注册 2009-9-11
来自 北京
家族 轩辕学院


发表于 2009-9-15 23:50 资料 个人空间 短消息 只看该作者
回复 #17 showzhuge 的帖子

这是个好办法!
如果我修改exe后仍然存在问题的话,就这么办吧。
顶部
性别:男-离线 岱瀛
(deving)

长平侯
川峡东路经略使
监管使

Rank: 19Rank: 19Rank: 19Rank: 19
组别 经略使
级别 左将军
好贴 1
功绩 2293
帖子 1370
编号 55810
注册 2005-12-22
来自 人间
家族 慕容世家


发表于 2009-9-16 00:03 资料 个人空间 短消息 只看该作者
如果start没有修改我整形变量的代码的话,那根据我的备忘记录里,整形变量和指针变量的地址如下:

55B000                  整型变量
563000                指针变量

55A400 ~ 55B000 并非这些变量区,是其他应用。而55A000 ~  55A3FF  (1024个) 是人物特造。

这些信息都会存在新增的存档文件里的。

另外,布尔变量是曹操传原来就有的,本身就是4字节。
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-6-30 05:15
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.015624 second(s), 11 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP