为什么在摩托罗拉68k中dbra对于这么大的循环计数如此之快?

杰森

我正在学习Motorola 68k汇编,并且编写了以下浪费时间的循环:

    move.l #0x0fffffff,%d0
    bsr timewaster
    rts

timewaster:
    dbra %d0,timewaster
    rts

这次浪费的循环几乎立即完成。我在调试器中逐步执行了代码,以确保它实际上减去d0了0(确实如此)。但是,另一个浪费时间的循环需要永远完成:

    move.l #0x0fffffff,%d0
    bsr timewaster
    rts

timewaster:
    sub.l #1,%d0
    bne timewaster
    rts

那么为什么代码使用起来dbra这么快?

我在TI-89仿真器中运行了这些程序。

托马斯·杰格

尽管由于实际处理器上的访存次数较少而会有一些改进,但时间安排差异如此之大的原因是这两种方法使用的大小不同。

从《程序员参考手册》的页面上DBcc

如果终止条件不成立,则计数器数据寄存器的低16位减1。如果结果为-1,则从下一条指令继续执行。如果结果不等于-1,则在程序计数器当前值加上符号扩展的16位位移所指示的位置继续执行。

因此,该DBcc指令仅操作并检查循环计数寄存器的低位字。因此,SUBBcc版本的时间将比〜版本长4000倍DBcc如果您使用SUB.W而不是SUB.L我希望您获得更多类似的运行时间。

DBcc指令将执行0x10000的时间,而BNE指令将执行0xFFFFFFF可倍。

请注意,循环计数器的高阶字不受的影响DBcc,因此循环应以D0中的0x0FFFFFFF退出。SUB.L/BNE版本应该在D0 0退出。


这与问题没有特别的关系,但是通读手册,似乎在某些地方对DBcc指令的确切行为略有分歧具体来说,当条件为真时,循环计数器为0时的行为。两者都导致未采用分支,但是它们在循环计数寄存器中的最终结果上存在分歧。

程序员参考手册,修订版1(M68000PM / AD,修订版1)指出,条件为真优先,并且循环计数器的减量值未存储回去,而在寄存器中保留了0。以下是手册中的内容:

If Condition False
    Then (Dn - 1 -> Dn; If Dn != -1 Then PC + d_n -> PC)

《 M68000微处理器用户手册》,第九版(MC68000UM),附录A(MC68010循环模式操作)说,减一的结果优先,并且结果为-1导致将结果存回,而留下-1在寄存器中。根据手册中的描述构建以下内容:

If Dn - 1 == -1
    Then Dn - 1 -> Dn
Else
    If Condition False
        Then (Dn - 1 -> Dn; PC + d_n -> PC)

通常,由于计数而导致的退出将保留-1,而条件退出将保留不同的值(假设计数器并非从0xFFFF开始)。当两个源均为真时,这两个源就寄存器中的值不一致。

我认为PRM是正确的,是行为的权威来源,并且由于它与UM中较早的描述相匹配,但是UM可能暗示了如何实现该指令,至少在MC68010上如此。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

摩托罗拉68k处理器中是否有任何性能计数器?

摩托罗拉68k地址错误

摩托罗拉 68k:了解状态注册器标志状态

摩托罗拉68K TRAP指令是通往OS的桥梁

为什么MATLAB在矩阵乘法中如此之快?

为什么查询在Entity Framework中花费这么长时间,而在SQL中却如此之快呢?

为什么C ++模板计算如此之快?

为什么这个C ++程序如此之快?

为什么从内存映射文件读取如此之快?

为什么列表乘法如此之快?

为什么在Python 3中“范围(10000000000000001)”如此之快?

为什么USB串行在Linux中如此之快?

为什么在Python 3中复数求幂如此之快?

为什么Dask的执行速度如此之慢,而多处理的执行速度却如此之快?

为什么三元运算符如此之快?

为什么Spark从S3读取和写入如此之快

为什么 Pandas 的速度如此之快?如何定义这样的函数?

当今计算机如此之快,为什么查看PDF文件仍然很慢?

为什么随后用youtube-dl下载的速度如此之快?

为什么此代码在进行优化编译时运行得如此之快?

是什么使Python的列表附加方法如此之快?

是什么使Java编译器如此之快?

海龟动画在python中如此之快

为什么只有1个预配置读取容量单位的DynamoDB扫描速度如此之快?

Python Pandas MySQL - 为什么在将数据帧写入数据库时 SQLite 速度如此之快

为什么默认的最大堆大小如此之小

为什么Ubuntu内核中的快照如此之少?它停止发展了吗?

为什么我的矩形形状在 java graphics 2d 中如此之小

为什么在MongoDB中对索引项进行“区别”和“计数”命令的速度如此之慢?