人工生命Tierraの作成等についてのブログ

人工生命Tierraや他の技術的な事柄、また日々の出来事などについても書いていきます。

人工生命Tierra10: 突然変異8の挙動について2

何が起きてるかやっと分かった

 

f:id:kkeiekk:20180204021828p:plain

3.2. 突然変異8の挙動解析:突然変異8オリジナルのコピー2体目以降

f:id:kkeiekk:20180311204833p:plain

f:id:kkeiekk:20180311204851p:plain

f:id:kkeiekk:20180311204902p:plain

f:id:kkeiekk:20180311204916p:plain

f:id:kkeiekk:20180311204926p:plain

3.2.1. 隣の個体のコードの読み取りと実行へ

1体目のコピーが終わった後、アドレス71~73のpop_cx,bx,axでレジスタcx,bx,axの値を回復するはずだったのですが、

アドレス44~46のpush_ax,bx,cxを実行していないために、

ax,bxは値が変化せず160,80のまま、cxはcall時に退避された、後のret用のアドレス値である28が復元されてしまいます。

このため次の命令であるret(アドレス74)を実行してもスタックに値が入っていないためretは成功せず、そのまま次の命令(アドレス75 nop_1)に移ってしまいます。

(本来はret命令によりcall命令の次であるアドレス29に移るはずでした。)

 

retで元の位置に戻れなかったため、そのままどんどんアドレス値が増える方向へ命令読み込みを進めていき、自分の体の範囲を外れ、隣の個体の命令を読みだしていきます。

 

 3.2.2. 空っぽの子供を作成する無限ループ

①スタックポインタ(sp)の値がおかしくなる 。

  (アドレス71~73)

②retできずにそのまま隣の個体の体まで読み出しにいってしまう。

  (アドレス74) 

③ malで領域を確保する。

  (アドレス107)

 ④スタックポインタの値が異常(①)なためcall失敗し素通りする。

  (アドレス108)

⑤malで領域確保だけはしたがコピー部分をcallできていないために何も入っていない領域をdivideしてしまう。

  (アドレス113)

⑥jmp命令はスタックは使わないため動作し、mal命令にジャンプする。

つまり③へ戻る。

  (アドレス114)

 

このように、malとdivideだけを繰り返して中身のない個体、領域だけを量産してしまっている。

前:人工生命Tierra9_突然変異8の挙動について1

次:人工生命Tierra11_突然変異8の挙動について3