在带有寄存器空间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
任何人都可以让我知道如何做到这一点,我没有任何线索,因为没有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个字节的倍数。
如果机器仅支持与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)
实现。除了内存是字节 - 可调的,但单词比字节宽,您需要对表的缩放索引,因此这不起作用。