[英]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
任何人都可以让我知道如何做到这一点,我不知道,因为没有inc
, dec
和一些算术指令,我该如何继续?
我不需要代码,但我提前感谢任何线索。
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.