2

这是学校的作业。我被要求用汇编编写一个 I/O 映射程序。

我被困在第 1 级,我只是从键盘读取并使用轮询方法写入监视器。

###########################################################
.text 0x00400000

main:
    addi    $s0, $0, 0                      #   save address for transmitter data
    lui     $s0, 0xffff
poll_read:
    lw      $t0, 0($s0)                     #   read transmitter data word
    andi    $t0, $t0, 0x1                   #   keep the 1st bit
    beq     $t0, $0, poll_read              #   not ready, go back
    lw      $t1, 4($s0)                     #   read transmitter control word
    andi    $t1, $t1, 0xff                  #   keep the 1st 8 bits
    addi    $t1, $t1, 1

poll_write:
    lw      $t0, 8($s0)                     #   read receiver data word
    andi    $t0, $t0, 0x1                       #   keep the 1st bit
    beq     $t0, $0, poll_write             #   not ready, go back
    sw      $t1, 0xc($s0)                   #   display monitor
    j       poll_read

问题是 0xffff 0000 的就绪位始终为 0。

所以,我不能做任何其他事情。

有什么技巧可以让它起作用吗?更改一些设置?

4

1 回答 1

1

您必须在 PCSpim 设置中选择“Mapped I/O”。据此:http ://www.cs.nott.ac.uk/~psztxa/g51csa/l12-hand.pdf似乎是必需的。

我查看了您的代码,它似乎是正确的。

但是,虽然代码是正确的,但注释却相反。也就是说,您的第一个注释lw是“读取发射器数据字”。评论应该说的是“读取接收器控制字”。还有一些其他的。

于 2016-02-23T00:00:37.940 回答