繁体   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