簡體   English   中英

幫助理解 RedCode

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM