[英]Helping understanding RedCode
我正在嘗試學習 redcode,因為制作機器人看起來很有趣。
對於那些不知道什么是 redcode 的人,這里有一個簡短的解釋。 這是一種類似 ASM 的語言,但要簡單得多。 它用於編寫需要關閉虛擬內存中其他程序的小程序。 (有關更多信息,請參見此處: http : //vyznev.net/corewar/guide.html )
這是一段代碼:
;redcode
;name Mice
;author Chip Wendell
;strategy paper (replicator)
;history Winner of the 1986 ICWS tournament
Top dat #0, #0
Start mov #12, Top
Loop mov @Top, <Target
djn Loop, Top
spl @Target,0
Spacer equ 653
add #Spacer,Target
jmz Start, Top
Target dat #0, #833
end Start
基本策略是將自身復制到另一個地方,並分叉該過程。 我不明白的是這個規則:
Loop mov @Top, <Target
我明白這行的意思。 就是說,把目標的B-Field移到最高點B-Field點的那條線上,減小目標B-Field的值。
第一次執行循環時,第一行將是:
Top dat #0, #12
據我所知,帶有 Loop 的那一行意味着:將指令向前移動 12 行(用 dat #0、#0 填充)到第 833 行。
但是當這段代碼被執行時,這行代碼被放置在了第 839 行。
有人明白發生了什么嗎?
好的,這需要大量閱讀,但這是您的答案:
正如您正確推測的那樣,第一條指令使 Top 成為 DAT #0、#12。 很簡單,但下一條指令比較棘手。 首先,它減少 Target 的 B 值(使其為 832)。 然后,它將 Top 處的指令復制到相對於 Target前面 832 行的位置。 這就是關鍵:間接尋址模式意味着目標是相對於偏移量讀取的 B 值。 現在看編譯后的代碼,前面有行號:
0000 Top DAT.F #0 #0
0001 Start MOV.AB #12 $-1
0002 Loop MOV.I @-2 <5
0003 DJN.B $-1 $-3
0004 SPL.B @3 $0
0005 ADD.AB #653 $2
0006 JMZ.B $-5 $-6
0007 Target DAT.F #0 #833
如您所見,Target 位於第 7 行,因此相對於 Target 前面的 832 行是第 839 行。
希望這可以為您解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.