assembly 如何在LMC语言中反转列表?

bvhaajcl  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(124)

我在LMC中有一个列表,我想尝试将其反转如下:
第一个

  • 我试着先用表的大小找到正确的元素-然后我从那个指令中减去200,这样指令就从520变成了320。
  • 实际上,我将指令从LOAD(加载累加器中的当前内容到RAM中的第20个平方)更改为STORE(存储累加器中的当前内容到RAM中的第20个平方)
  • 然后,我将索引0处的内容选项卡加载到累加器(111)中,然后将其保存在最后一个索引中
  • 我不知道我必须做什么之后
  • 我觉得我对这个问题的理解是错误的
right_el lda size
        sub one
        sta size
        lda load
        add size
        sub 2hund
        sta save

load    lda tab
        bra save
inc     lda load
        add one
        sto load
        bra load

save    dat
        bra right_el

left_el dat

tab     dat 111
        dat 222
        dat 333
        dat 444
        dat 555
one     dat 1
size    dat 5
temp    dat
2hund   dat 200

我试着一步一步地运行程序。我设法把表变成:

tab     dat 111
        dat 222
        dat 333
        dat 444
        dat 111

但我不知道之后该怎么办

iugsix8n

iugsix8n1#

这是一个良好的开端。几个问题:

  • save处,您将写入移动后的值,但因此会丢失原来的值。
  • 不使用temp,但在覆盖原始值之前,您需要它来保存原始值,以便您可以从temp再次读取它,并将其写回列表的前半部分。
  • 当分支返回到顶部时,您需要将大小减少2而不是1,因为加载地址增加了1,并且到目标的距离减少了2而不是1。您可以通过将程序的开头更改为以下内容来解决此问题:
lda size
         add one  # to compensate for the minus 2
         sta size
right_el lda size
         sub two  
         sta size

...并将two定义为2。

  • 你需要一个停止条件。当减少的大小为零或更小时,程序应该停止。
  • inc处的代码从未执行。它应该执行。
  • 您还需要两个自修改指令。您目前有以下指令:
  • 从列表左侧开始阅读
  • 写入列表的右侧

但还需要两个:

  • 从列表右侧阅读
  • 写入列表的左侧

其他备注:

  • 您的代码混合了助记符的两种变体:stosta。我会坚持一种口味。
  • 除了bra save,您可以将目标代码块移到那里,这样就不需要分支了。
  • 我会使用twohund而不是2hund作为标签。通常的做法是不以数字开始标识符,一些模拟器甚至可能会有这样的问题。
  • 我将使用loop而不是right_el作为标签,因为循环肯定必须覆盖整个交换--从左到右,反之亦然。
  • 以下三个说明:
sta size
lda load
add size

可以用两种方式编写:

sta size
add load

下面是生成的代码--我在您的一些标签后面添加了“left”和“right”,这样我就可以添加自己的标签并进行区分:

start     LDA size
          ADD one  # to compensate for the minus 2
          STA size

loop      LDA size
          SUB two
          BRP continue  # check the loop-stop condition
quit      HLT
continue  BRZ quit
          STA size

          ADD loadleft  # add size in one go
          STA loadright # manage the other dynamic opcode
          SUB twohund
          STA saveright
          SUB size
          STA saveleft # and another dynamic code.
 
loadright DAT
          STA temp   # first save the value that is targeted
loadleft  LDA tab
saveright DAT
          LDA temp   # copy in the other direction
saveleft  DAT

inc       LDA loadleft
          ADD one
          STA loadleft # use consistent mnemnonic
          BRA loop

tab       DAT 111
          DAT 222
          DAT 333
          DAT 444
          DAT 555
one       DAT 1
two       DAT 2
size      DAT 5
temp      DAT
twohund   DAT 200


<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>

你可以在这里运行代码。

相关问题