如何使用程序集在假设的CPU ISA中复制寄存器

By simon at 2018-02-07 • 0人收藏 • 39人看过

假定在寄存器空间为A-Z的假设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
任何人都可以让我知道这怎么做,我不知道,因为 没有inc,dec和一些算术指令,怎么可以的 我继续? 我不需要代码,但任何线索我怎么才能继续这是赞赏 提前。

1 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

ldr/str支持哪些寻址模式?你可以吗 ldr C, 4(A)?如果是这样,你可以完全展开循环到w讨厌的流离失所 限制寻址模式允许。 尽管如此,仍然包括比较,除非你可以对待

.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
1作为一个 建立时间常数(这是有道理的,因为你被要求写一个 程序,而不是一个功能...) 例如
    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:
无线th寄存器的宽度大于1个字节,因此不可能只复制一个字节。 (没有ALU指令将一个字节合并到o中ld一个字的值,没有 字节存储)。 假设寄存器是4个字节宽(因为OP说它有32位 寻址),4 bytes是我们可以复制的最小值。如果机器允许 未对齐的地址,我们可以通过增加从4向上复制任何数量该 一次处理1个字节,但上面的代码总是复制4的倍数 字节。 如果机器仅支持字对齐加载/存储,重叠最后 字3字节甚至不是一个选项。


*或者你可以用一个完整的,展开搜索下一个最高 数字,使用MOV立即和CMP / BEQ *。 (或二进制搜索的BLT / BGT)。 我是发明家g假定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
如果你的指令集真的是残废,那么你的电脑是 barely可编程,并需要massive程序,枚举度过每一个 寄存器可能具有的价值。 您可以使用二进制搜索在O(log(register_width))中增加运行 TI我而不是O(价值)时间。


也许你可以在内存中存储查询表,让你实现 inc A为ldr A, 5000(A).除非内存是可以字节寻址的,但是 单词比一个字节宽,你需要一个表的缩放索引,所以这个不起作用。

登录后方可回帖

Loading...