Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 68k组件中的延迟环_Assembly_Delay_68000_Easy68k - Fatal编程技术网

Assembly 68k组件中的延迟环

Assembly 68k组件中的延迟环,assembly,delay,68000,easy68k,Assembly,Delay,68000,Easy68k,我想在汇编中编写一个延迟循环。它应产生N个周期的延迟 我的想法是创建一个for循环并迭代NOP指令。在这种情况下,我是否必须减少N由程序的其他部分(例如调用for循环)引起的循环数?此外,for循环的每次迭代是算作1个周期还是2个周期 在最好的情况下——有人实现过这样的延迟周期吗?没有一条68k指令可以在一个周期内执行。即使是一个简单的NOP也需要四个周期——所以你需要稍微调整一下你的期望值 我们能想象的最简单的延迟环路是 move.w #delay-1,d0 loop: dbf

我想在汇编中编写一个延迟循环。它应产生
N个
周期的延迟

我的想法是创建一个for循环并迭代
NOP
指令。在这种情况下,我是否必须减少
N
由程序的其他部分(例如调用for循环)引起的循环数?此外,for循环的每次迭代是算作1个周期还是2个周期


在最好的情况下——有人实现过这样的延迟周期吗?

没有一条68k指令可以在一个周期内执行。即使是一个简单的NOP也需要四个周期——所以你需要稍微调整一下你的期望值

我们能想象的最简单的延迟环路是

       move.w #delay-1,d0
loop:  dbf    d0,loop       ; 10 cycles per loop + 14 cycles for last 
                            ; (branch not taken) 
这将延迟10个周期。请注意,延迟是字大小的,因此构造仅限于14到655354个周期之间的延迟。如果想要更宽的范围,则需要使用使用长字计数器的不同构造:

       move.l  #delay,d0
       moveq.l #1,d1
 loop: sub.l   d1,d0        ; 6 cycles for Dn.l->Dn.l
       bne.s   loop         ; 10 cycles for branch
这将在每次迭代中消耗16个周期。但是,它接受一个长字循环计数器


如果要增加可实现的延迟,可以考虑嵌套延迟LOP或更复杂的指令以及循环内的寻址模式。然而,这两个是最短的延迟循环。

没有68k指令可以在一个周期内执行。即使是一个简单的NOP也需要四个周期——所以你需要稍微调整一下你的期望值

我们能想象的最简单的延迟环路是

       move.w #delay-1,d0
loop:  dbf    d0,loop       ; 10 cycles per loop + 14 cycles for last 
                            ; (branch not taken) 
这将延迟10个周期。请注意,延迟是字大小的,因此构造仅限于14到655354个周期之间的延迟。如果想要更宽的范围,则需要使用使用长字计数器的不同构造:

       move.l  #delay,d0
       moveq.l #1,d1
 loop: sub.l   d1,d0        ; 6 cycles for Dn.l->Dn.l
       bne.s   loop         ; 10 cycles for branch
这将在每次迭代中消耗16个周期。但是,它接受一个长字循环计数器


如果要增加可实现的延迟,可以考虑嵌套延迟LOP或更复杂的指令以及循环内的寻址模式。然而,这两个是最短的延迟循环。

为什么不试试看呢?每个汇编语言指令都需要时间。因此,如果这是一个由代码中其他位置调用的函数,那么子例程调用和返回完成的堆栈推送和弹出肯定需要考虑到计时常数中。这取决于微体系结构的细节,比如68000与68010,以及它的2指令循环缓冲区。与带I-cache的68020相比。与68060相比,具有2条超标量管道(每个周期2条指令)。调查中的一个明显方法是从较旧的linux内核检查68k bogomips循环。:-)只要一个
dbf d0,$-2
就可以完成这项工作。每个迭代都需要10个周期。为什么不试试看呢?每个汇编语言指令都需要时间。因此,如果这是一个由代码中其他位置调用的函数,那么子例程调用和返回完成的堆栈推送和弹出肯定需要考虑到计时常数中。这取决于微体系结构的细节,比如68000与68010,以及它的2指令循环缓冲区。与带I-cache的68020相比。与68060相比,具有2条超标量管道(每个周期2条指令)。调查中的一个明显方法是从较旧的linux内核检查68k bogomips循环。:-)只要一个
dbf d0,$-2
就可以完成这项工作。我假设这些计时是从68000本身开始的,不考虑68010上的循环缓冲区或68020上的I-cache。这也提出了Easy68k是否是周期精确模拟器的问题。(如果你试图编写一个以恒定速度运行的游戏,那么来宾循环是否与实时相对应,或者它是否仍然取决于主机速度。也许@spadel通过使用Easy68k知道答案。)@PeterCordes这些示例使用原始的68k循环计时,就像Easy68k一样。easy68k并不声称是周期精确的,但它确实记录了一个真正的CPU在程序中所花费的周期数。我认为
sub.ld1,d0
需要8个周期(与
subq.l#1,d0
)@chtz-Hm相同。我的手册上写着“6”。(原68000程序员参考手册)这里的表8-4有一个注释
**
,说明“如果有效地址模式为寄存器直接或立即,则六个时钟周期的基准时间增加到八个”。这里的信息相同:我假设这些计时来自68000本身,不考虑68010上的循环缓冲区或68020上的I-cache。这也提出了Easy68k是否是周期精确模拟器的问题。(如果你试图编写一个以恒定速度运行的游戏,那么来宾循环是否与实时相对应,或者它是否仍然取决于主机速度。也许@spadel通过使用Easy68k知道答案。)@PeterCordes这些示例使用原始的68k循环计时,就像Easy68k一样。easy68k并不声称是周期精确的,但它确实记录了一个真正的CPU在程序中所花费的周期数。我认为
sub.ld1,d0
需要8个周期(与
subq.l#1,d0
)@chtz-Hm相同。我的手册上写着“6”。(原68000程序员参考手册)这里的表8-4有一个注释
**
,说明“如果有效地址模式为寄存器直接或立即,则六个时钟周期的基准时间增加到八个”。这里有相同的信息: