使用自定义CPU计算斐波那契序列的问题



不确定这是否是发布这篇文章的合适网站,如果不是,请告诉我应该在哪里发布。

这应该输出1、1、2、3、5,但它只是陷入了一个循环。我不知道为什么会发生这种情况,循环检查索引是否<20,所以我不明白为什么它会卡在所说的循环中。

  • 代码:
; Macros for registers
$MACRO AX : 0
$MACRO BX : 1
$MACRO CX : 2
$MACRO DX : 3
; Load first 2 values
MVDR 1, AX
MVDR 1, BX
; Set loop index to 0
MVDR 0, CX
; Add the values
ADD AX, BX

; Load result into RAM
MVRAD AX, CX
; Set up pointers for the numbers to add
MVRR CX, DX
DEC DX
; Put the (pointed?) values into AX and BX
MVARD CX, AX
MVARD DX, BX
; Increment loop index
INC CX

; Jump to the start if loop index < 20
CPRD CX, 20
JILT 3
; Output first 5 values
MVAR 0, CX
OUT CX, 0
MVAR 1, CX
OUT CX, 0
MVAR 2, CX
OUT CX, 0
MVAR 3, CX
OUT CX, 0
MVAR 4, CX
OUT CX, 0
  • 通过自定义模拟器运行的代码(执行流(:
0 : MVDR, 1 0
1 : MVDR, 1 1
2 : MVDR, 0 2
3 : ADD, 0 1
4 : MVRAD, 0 2
5 : MVRR, 2 3
6 : DEC, 3
7 : MVARD, 2 0
8 : MVARD, 3 1
9 : INC, 2
10 : CMPRD, 2 20
11 : JILT, 3
4 : MVRAD, 0 2
5 : MVRR, 2 3
6 : DEC, 3
7 : MVARD, 2 0
8 : MVARD, 3 1
9 : INC, 2
10 : CMPRD, 2 20
11 : JILT, 3
[Repeats loop indefinitely]
  • 指令集(如果我应该将其作为链接发布/应该澄清内容,请告诉我(:
0x00 NOOP                   ; Does nothing
0x01 MVRR <REG0> <REG1>     ; Move data from <REG0> to <REG1> (does not clear source register)
0x02 MVDR <DATA> <REG>      ; Move data from <DATA> to <REG> (effectively sets the data in <REG> to <DATA>)
0x03 MVAR <ADDR> <REG>      ; Move data from <ADDR> to <REG> (does not clear source address)
0x04 MVRA <REG> <ADDR>      ; Move data from <REG> to <ADDR> (does not clear source register)
0x05 MVARD <REG_ADDR> <REG> ; Move data from <REG_ADDR> to <REG> (does not clear source address)
0x06 MVRAD <REG> <REG_ADDR> ; Move data from <REG> to <REG_ADDR> (does not clear source register)
0x07 PSHR <REG>             ; Push <REG> to the stack
0x08 PSHD <DATA>            ; Push <DATA> to the stack
0x09 POPR <REG>             ; Pop data off the stack into <REG>
0x0A ADD <REG0> <REG1>      ; Adds <REG0> to <REG1> and stores the result in <REG0>
0x0B SUB <REG0> <REG1>      ; Subtracts <REG0> from <REG1> and stores the result in <REG0>
0x0C OUT <REG> <DATA>       ; Outputs <REG> on port <DATA>
0x0D IN <REG> <DATA>        ; Waits for input on port <DATA>, then stores the value in <REG>
0x0E JMPR <REG>             ; Jumps to address <REG>
0x0F JMPD <DATA>            ; Jumps to address <DATA>
0x10 CMP <REG0> <REG1>      ; Compare <REG0> to <REG1>
0x11 CPRD <REG> <DATA>      ; Compare <REG> to <DATA>
0x12 JINE <DATA>            ; Jumps to address <DATA> if the previous CMP result was !=
0x13 JIEQ <DATA>            ; Jumps to address <DATA> if the previous CMP result was ==
0x14 JIGT <DATA>            ; Jumps to address <DATA> if the previous CMP result was >
0x15 JILT <DATA>            ; Jumps to address <DATA> if the previous CMP result was <
0x16 INC <REG>              ; Increment <REG>
0x17 DEC <REG>              ; Decrement <REG>

我刚刚想明白了——这实际上是我的CPU,而不是我的代码。CPRD指令从未重置CMP标志,因此JILT指令每次都会跳过。。。我不知道我是怎么忘记做的。

最新更新