如何使用组件中的假设CPU ISA复制寄存器



在带有寄存器空间A-Z的假设CPU ISA中给出以下说明,编写一个程序集从地址A复制n个字节的程序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个字节的倍数。

如果机器仅支持与Word Aligned Load/Store相关的,则将最后一个字重叠为3个字节,甚至不是一个选项。


,或者可以使用MOV即时和CMP/BEQ 进行完全未汇总的搜索来实现Inc。(或用于二进制搜索的BLT/BGT(。

我正在发明语法,用于在A-In-a-in-in-negister上,假设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

如果您的指令集确实是如此残废,则您的计算机是几乎不可行的,并且需要 massive 程序,以枚举寄存器可能拥有的所有可能值。p>您可以使用二进制搜索以在o(log(regission_width((时间而不是o(value(时间时进行增量运行。


也许您可以将查找桌存储在内存中,使您可以将inc A作为ldr A, 5000(A)实现。除了内存是字节 - 可调的,但单词比字节宽,您需要对表的缩放索引,因此这不起作用。

最新更新