10万行汇编代码

偶尔会有人问我有关编写超级任天堂游戏的问题,那些人是怎么管理成千上万行16位汇编语言代码组成的项目的?答案是:它并不像你想象中那么艰难。

SNES硬件的手册有几百页,我不记得具体是多少了,最多400页吧。加入一个详细的65816汇编语言教材并结合我们现在说的最多800或900页,这只是我认为要完全理解一个OSX计算机的所需页数11,000的百分之八十。当然,你在C语言里的汇编代码也会出现很多无形的错误。比如,这是一些老的x86代码:

mov ax, 20
mov bx, -1
int XX

这些代码设置了一些参数并调用中断。它看起来是正确的,也可以正常运行,并且可能在一个商业化的产品中使用,但是在新版的MS-DOS中它崩溃了。为什么?因为第二个参数应该传到dx寄存器,而不是bx。它只有在前面有代码发生了中断并返回-1到dx的情况下才能正常运行,但这是很罕见的,所以上面代码中的第二行并没有做任何有用的事。

完全使用汇编语言工作的秘密是:做到有组织,写代码前先思考并保代码持清洁和易懂。这和写好的Javascript和C++代码是有很多相似之处的。Steve McConnell编写的Code Complete是真正的超级任天堂游戏开发者指南。

但是这些谈论的编程语言和硬件是落后的。Jordan Mechner设计和编写了Apple II上的Prince of Persia,游戏和展示所有关卡的编辑器是用8位6502汇编语言编写的,他用日记记录了写这个游戏的过程。你可能期望这个日记里都是 编程 参考和6502编程诀窍,但是里面一点关于那个的内容也没有。当然,他在幕后做高难度的技术工作,但是那不是他要记录的。他记录的是一个设计师和导演的经历:一个人在大学毕业后居住在离家很远的地方,为自己的梦想走了很多弯路(别被吓倒了,那是很迷人的故事)。

他可能有另外一些编程的记录,但是我想应该没有。尽管如此,他远不止在想技术问题:一个小说家的个人日记的内容不会全是讲语法和句子结构的~

(如果你喜欢这篇文章,你可能还会喜欢The Pure Tech Side is the Dark Side

原文链接/OsChina.NET编译

转载于:https://my.oschina.net/tsl0922/blog/55948

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 首先,我们需要知道计算机时钟的频率。根据您提供的信息,晶振频率为12MHz,也就是1秒钟有1200万个时钟周期。那么10ms就是120000个时钟周期。 接下来,我们可以使用双重循环来实现定时器。具体步骤如下: 1.使用汇编语言编写计时函数,该函数接受一个参数,表示需要延时的时间(以毫秒为单位)。 2.计算需要循环的次数,假设每次循环需要1个时钟周期,那么需要循环120000次。 3.使用两个嵌套的循环来实现计时。外层循环控制需要循环的次数,内层循环每次循环1个时钟周期。 4.在循环结束后,返回函数。 下面是示例代码: ``` delay: push ebp mov ebp, esp mov eax, [ebp+8] ;获取函数参数,即需要延时的时间 mov ebx, 12 ;每毫秒需要循环的次数 mul ebx ;计算需要循环的次数 mov ecx, eax ;保存需要循环的次数 outer_loop: mov ebx, 10000 ;每次循环需要1个时钟周期 inner_loop: dec ebx ;减少计数器 jnz inner_loop ;继续循环,直到计数器为0 dec ecx ;减少计数器 jnz outer_loop ;继续循环,直到计数器为0 pop ebp ret ``` 在上面的代码中,我们使用了mul指令来计算需要循环的次数,使用了内部计数器来控制循环次数。由于每次循环需要1个时钟周期,所以我们使用了一个计数器来控制内层循环的执次数。 需要注意的是,由于不同的计算机时钟频率可能不同,所以需要根据实际情况来调整循环次数和计数器的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值