2024-09-22

PDP-11におけるSOB命令の挙動

UNIX V6のカーネルのブートストラップ処理を追いかけています。m40.sの「start」ラベルから始まる処理を調べていますが、Lions本で言うと0628行目に、「sob r3,1b」 という処理が現れます。ここで使われている命令「sob」について確認してみました。


『PDP-11/70 PROCESSOR HANDBOOK』の4-67ページに命令「SOB」について説明があります。

Operation: R ← R -1 if this result = 0 then PC ← PC -(2x offset)
Description: The register is decremented. If it is not equal to 0, twice the offset is subtracted from the PC (now pointing to the following work).


この命令が何をしようとするものなのかは分かりましたが、よく見ると「Operation」と「Description」の挙動が整合していません。前段の、「Operation: R ← R -1」というのが、「Description: The register is decremented.」と説明されているのは、整合がとれています。しかし後段で、「if this result = 0 then PC ← PC -(2x offset)」と「If it is not equal to 0, twice the offset is subtracted from the PC (now pointing to the following work).」とは、意味が逆になっているのではないでしょうか。この命令がどうこうではなく、一般的に考えれば、「ある変数が0になるまでループする」というのが普通かと思います。そして「Description」では「If it is not equal to 0,」とあるので、思っていたとおりなのですが、「Operation」では「If this result = 0」となっていて、これは違うのではないかと思います。


念のために他の資料も確認してみました。

  1. 『PDP-11/40 PROCESSOR HANDBOOK』では、「Description」の記述は同じですが、「Operation」が「If this result ≠ 0」となっています。
  2. 『PDP-11/45 PROCESSOR HANDBOOK』は、11/70と同様です。「Description」の記述も同じで、「Operation」も「If this result = 0」になっています。
  3. 『PDP-11/34 PROCESSOR HANDBOOK』は、11/40と同様です。「Description」の記述も同じで、「Operation」は「If this result ≠ 0」になっています。

 

これらより、命令「SOB」の説明は、11/40が正しく、11/45や11/70は誤植なのでしょう。

0 件のコメント:

コメントを投稿