|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 楚门 于 2012-6-8 15:36 编辑
以前在这个版块发过一个关于磁芯大战的帖子:http://bbs.fishc.com/thread-17431-1-1.html,相信大家对这个游戏都有一定的了解了,那时我还没有研究过这个游戏,只是上传了一个资料及软件供大家下载,最近几天把这个游戏的汇编语法认真的看了一下(现在正在看一些实例程序,还没有开始写代码),在这里就写点我自己的学习心得。我也是菜鸟,高手您就当看热闹了哈!
关于游戏的介绍就不谈了,直接进入主题,其实很多人对这个有游戏都有很大的兴趣,奈何这游戏在国内并不是很流行,所以中文资料也是少的可怜,以至于很多人都没怎么认真的去研究这个游戏,所以在网上几乎找不到交流这个游戏的论坛或是QQ群,在这里只是给大家提供一个研究这个游戏的思路,废话少说,开始吧!
现在基本流行的是94标准,所以88标准就不说了,corewar的指令和16位汇编语言非常非常相似,看看他的指令集就知道了:DAT MOV ADD SUB MUL DIV MOD JMP JMZ JMN DJN SPL SLT CMP SEQ SNE NOP.怎么样?是不是很相似,每个指令的功能相信大家都能猜出一二,不懂得可以在上面的链接中找到资料(记得咱们老大好像在哪个帖子上上传过,嘻嘻,记不清楚了),大家看那个资料也许会感觉很迷糊,看来看去还是感觉这些指令的功能和自己想的不一样(呵呵,我也是这种感觉,不知道是翻译的问题还是原文没表达好),为什么会感觉很迷糊,原因就在于这些指令有些根本不需要两个数据区(A和B数据区),而且标准还提供的了七个指令修饰符:.A .B .AB .BA .F .X .I 。还没完呢!往后看,还发现了八个寻址修饰符:# $ @ < > * { }。就是这些了(每个修饰符的意思大家可以在资料上找到,不过我感觉资料上很多地方没说清楚),咋一看好像每个指令都可以与这些指令修饰符和寻址修饰符搭配,又好像不可以(例如JMP或者SPL和.AB搭配是什么效果),那么其他的指令呢?感觉很头大是吧,然后再和那些寻址修饰符搭配起来呢?晕了…………,给大家提供一种思路,先这条指令的AB数据区(它是什么寻址方式,只有一个数据区的当然就只能寻址到一个内存单元),通过AB数据区的数据及寻址方式找到这条指令所要操作的两个内存单元(有时是一个,你懂得!!)然后再看那条指令的修饰符,其目的是明白这条指令操作的是A数据区还是B数据区(这里的数据区是指通过这条指令的AB区寻址到的内存单元的数据区),当然.I就是操作整个寻址到的内存单元,.A就是只操作寻址到的内存单元的A数据区(说的有点绕哈),是吧!说起来真的很绕,所以接下来就没必要一一告诉大家这里关于指令修饰符以及寻址修饰符的细节东西,相信说了大家看着也晕,也记不住,主要想告诉大家:很多细节问题资料上都是不会一一介绍的很详细的,这些东西只有靠我们自己慢慢调试才会发现,只有这样大家才会对这个游戏有比较深刻的理解。
例如关于SUB指令,资料上写着:A减B并将结果存入B.但是我调试的时候发现,并不是这样,应该是B减A并将结果存入B,不知道是翻译错误还是什么情况。还比如:关于{和}寻址修饰符(它们都是间接寻址),它们的区别不仅是一个自减和一个自加的区别,重要的区别还有:一个是在指令执行前对指针(因为是间接寻址,所以可以看做是指针)自减,另一个是在指令执行后对指针自加(类似的区别在<和>上可以看到)。其实不光是这个游戏,对于所有想学编程的鱼油们来说,如果不懂的调试程序,那么程序运行起来了并且结果没错误你就认为你的程序没有问题了,那是大错特错,只有懂得调试才能知道程序在内存中到底做了什么。《C语言深度剖析》这本小册子的作者有个观点:写程序不要用printf打印结果,想知道运行结果,就去调试(观察内存)。可见程序调试能力的重要性!!!
最后,大家有兴趣研究corewar这个游戏的可以加这个群(我一个人捣鼓来捣鼓去木有意思啊):242786171,由于我不是QQ会员(拒绝给腾讯一分钱,嘻嘻),此群只能容纳100人,大家欲来从速咯.
|
|