簡體   English   中英

如何使用匯編復制假設的 CPU ISA 中的寄存器

[英]how to copy the register in hypothetical CPU ISA using assembly

在具有寄存器空間 AZ 的假設 CPU ISA 中給定以下指令,編寫匯編程序以將 N 個字節從地址 A 復制到地址 B

MOV C, 100 - Move a constant value 100 to register C
LDR A, Addr – Load Register A with contents of address Addr
STR B, Addr - Store the contents of register B to address Addr
CMP X, Y - Compare X & Y and set Equal/Less than and Greater than status flags
BEQ address – Branch/Jump to address, on status flag Equal is set
BGT address – Branch on greater than
BLT address – Branch on less than

任何人都可以讓我知道如何做到這一點,我不知道,因為沒有incdec和一些算術指令,我該如何繼續?

我不需要代碼,但我提前感謝任何線索。

ldr / str支持哪些尋址模式? 你能ldr C, 4(A)嗎? 如果是這樣,您可以將循環完全展開到尋址模式允許的任何位移限制。

但是,仍然包括比較,除非您可以將N視為構建時常量(這是有道理的,因為您被要求編寫程序,而不是函數......)

例如

    cmp   N, 1
    blt   done
    ldr   C, 0(A)
    str   C, 0(B)

    cmp   N, 5       # registers are probably 4 bytes wide, if addresses are 32-bit
    blt   done
    ldr   C, 4(A)    # copy next word
    str   C, 4(B)

    cmp   N, 9
    beq   done
    ...
done:

對於寬度超過 1 個字節的寄存器,不可能只復制一個字節。 (沒有將字節合並到字的舊值的 ALU 指令,也沒有字節存儲)。

假設寄存器是 4 字節寬(因為 OP 說它有 32 位尋址),4 字節是我們可以復制的最小值。 如果機器允許未對齊的地址,我們可以通過一次增加 1 個字節的地址從 4 向上復制任意數量,但上面的代碼總是復制 4 個字節的倍數。

如果機器只支持字對齊的加載/存儲,那么將最后一個字重疊 3 個字節甚至不是一種選擇。


或者,您可以使用 MOV 立即數和 CMP/BEQ 完全展開搜索下一個最高數字來實現 INC (或 BLT / BGT 進行二分查找)。

我正在為寄存器中的地址發明語法,假設 A 應該是寄存器名稱,而不是標簽

.copyloop:
    ldr    C, (A)
    str    C, (B)

    mov    D, 2
    cmp    A, 1
    beq    .found_A

    mov    D, 3
    cmp    A, 2
    beq    .found_A

    mov    D, 4
    cmp    A, 3
    beq    .found_A

    ...

 .found_A:
    mov    A, D       # presumably this is allowed, not only the mov-immediate form shown?

    # Then repeat that for B

    cmp    A, end_pointer   # end_pointer is a register holding a value you calculated somehow.
    blt  .copyloop

如果您的指令集確實如此殘缺,那么您的計算機幾乎無法編程,並且需要大量程序來枚舉寄存器可能具有的所有可能值。

您可以使用二進制搜索使增量運行在 O(log(register_width)) 時間而不是 O(value) 時間。


也許您可以在內存中存儲一​​個查找表,讓您將inc A實現為ldr A, 5000(A) 除非內存是字節可尋址但字比一個字節寬,否則您需要為表設置一個縮放索引,所以這不起作用。

暫無
暫無

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

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