簡體   English   中英

如何反轉 LMC 語言中的列表?

[英]How can you reverse a list in LMC language?

我在 LMC 中有一個列表,我想嘗試像這樣反轉它:

tab     dat 111
        dat 222
        dat 333
        dat 444
        dat 555

tab     dat 555
        dat 444
        dat 333
        dat 222
        dat 111

-我試圖通過使用表格大小首先找到正確的元素 -然后我從該指令中減去 200,以便它從 520 -> 320 變為指令。

-基本上,我將指令從加載累加器中當前的內容更改為 RAM 中的第 20 個方塊,以將累加器中當前的內容存儲到 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

但我不知道之后該怎么辦

這是一個好的開始。 幾個問題:

  • save時,您將寫入移動的值,但因此會丟失原先的值。

  • temp沒有被使用,但是你需要它在它被覆蓋之前保存原始值,這樣你就可以從temp再次讀取它並將它寫回到列表的前半部分。

  • 回到頂部時,需要將 size 減 2,而不是減 1,因為加載地址增加了 1,到目標的距離減 2,而不是 1。可以通過更改 start 來解決這個問題你的計划:

     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作為 label 而不是2hund 標識符不以數字開頭是很常見的做法,一些模擬器甚至可能對此有問題。

  • 我會使用loop作為 label 而不是right_el ,因為循環肯定會覆蓋整個交換——從左到右,反之亦然。

  • 以下三個指令:

     sta size lda load add size

    可以只寫兩個:

     sta size add load

這是生成的代碼——我用“左”和“右”為您的一些標簽添加了后綴,這樣我就可以添加自己的標簽並進行區分:

 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>

您可以在此處運行代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM