[英]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.