ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[Lions' Commentary on Unix] mtpi & mfpi

 
PDP-11 の次のふたつの命令について

mfpi : Move From Previous Instruction space
mtpi : Move To Previous Instruction space

Lions' Commentary on UNIX の説明を以下に引用。
mfpi前のアドレス空間中の指定ワードの値をカレントスタックにプッシュする。
mtpiカレントスタックをポップし、その値を前のアドレス空間中の指定ワードに格納する。

一読したところで理解できない。
「前のアドレス」というのは一体、何を指しているのだろうか。

ここで、一旦、次の問題を考えてみる。
PDP-11では、カーネル・メモリ空間とユーザ・メモリ空間の
ふたつの異なった メモリ空間 補足 があるが
では、これらのメモリ空間の間でどのように
データをやり取りするのだろうか(それをプログラミングするのだろうか)。

まず単純にカーネルのアドレスからデータをレジスタに読み込み、
ユーザメモリ空間のアドレスで指定されるメモリへコピーするのはどうだろう。

mov kadr, r0
mov r0, uadr


一見するとよさそうだが、PSW(プロセッサステータスワード)を無視している。
参照されるメモリ空間は、PSWの14,15ビットで決まることを思い出して欲しい。
したがって、参照するメモリ空間が異なる場合は、次のように、PSW を更新しなければならない。

mov kadr, r0
mov $140000, PS / ユーザモードに移行
mov r0, uadr
mov $30000, PS / カーネルモードに移行


少々、PSWの更新命令が怪しいけどやりたいことはこんな感じだ。
この方法の難点は、1ワードもしくは2、3ワードのコピー毎に
モード切替えが必要なことである。
大きなデータをコピーする場合、このモード切替は問題になる。
この問題、少し考えれば、メモリ空間の間でモード切替をせずに
データの受け渡しをするのは、なかなか難しい問題だとわかる。

カーネルモードとユーザモードで物理メモリを共有するという手もあるかもしれない。

しかし、もっと楽な解決方法がある。そう、mtpi, mfpi である。
引用した本文を見直すと、話の流れで「前のアドレス空間」とは、
前モード(PSW 12,13ビットに設定値)で参照されていた
メモリ空間のことであることがわかる。

これをふまえれば、残りの本文の理解は容易なはず。
この命令のメリットは、モード切替を行なわずに
連続してデータをコピーできることにある。
なお、UNIX において、ユーザプログラムとOSとでデータを
やり取りするのに広く用いられているそうである。

(補足)
メモリ空間、いいかえれば、アドレス空間。
このアドレス空間は、カーネル・モードとユーザ・モードに対して
それぞれ8組のAPR(アクティブ・ページ・レジスタ)で制御される。

[Lions' Commentary on Unix] PDP11 相対モード アドレッシング

 
Lions' Commentary on UNIX
PDP-11 のアドレッシング・モードのリラティブ(相対)モード(Relative Mode)がようやく、分かった。

まず、注目に値するのは、この相対モードにて、はじめて、即値を番地として扱う点。この即値はSSR0などのように、識別子で指定される場合もある。
それまでに説明のあったアドレッシングモードでは、
識別子を扱うにしても、メモリ番地としてではなく、単なる即値として扱うだけである。

次の注意点は、以下の本文。
現在のプログラムカウンタの値に相対するアドレスをプログラム列から取り出し、オペランドの絶対アドレスを求めるためにこれを pc の値に加える。

この説明から、
    inc    SSR0

がインクリメントするのは、{現在の pc の値} + {SSR0 (177572)} の番地であり、
pc の値は変わり得るのだから、この命令は実行場所によってインクリメントする番地が変わってしまう、という誤解してしまう。

しかし、 『PDP-11 MACRO-11 Language Reference Manual』 を読んで誤解が解けた。
以下、相対モードの説明から。
    mov   100, R3

これをアセンブると、

番地 20: 0 1 6 7 0 3
番地 22: 0 0 0 0 5 4
番地 24: (次のインストラクション)


となる。実行時、pc は次の命令を指していて、248であり、この mov 命令でオペランドとして参照されるアドレスは、
248 + 548 = 1008 となる。
つまり、アセンブると pc に足される値として、相対アドレスが設定されるのである。

本文に「相対するアドレスをプログラム列から取り出し」とあるから、このアセンブル仕様についても示唆しているのだが、そこまでは読み切れない。

[C言語] ++

 
++a は (a+=1) の syntax sugar としたら、a++ は何になるか。(a+=1; a-1) はダサい。 (tmp=a; a+=1; tmp) なのか。

まぁ、C にマッピングする必要も無いと思うけど、じゃぁ ++ 自体いらなさげ。

そもそも、++ という記号の起源は何処なんだろうな。
ささだのぺーじ Diary 2005年11月28日


[Tex] This file needs format `pLaTeX2e'

 
Windows XP にて、TeX4ht のコマンド htlatex を実行したところ、下記のようなエラーが発生。

C:\home\USER\tex>htlatex test "jp"

(中略)

This is JTeX, Version 3.141592-1.9.1 (Web2C 7.5.6)
LaTeX2e <2005/12/01>
Babel <v3.8h> and hyphenation patterns for english, usenglishmax, british, fren
ch, german, ngerman, nohyphenation, loaded.
(./test.tex (c:/tex/share/texmf-local/tex/platex/jsclasses/jsarticle.cls

! LaTeX Error: This file needs format `pLaTeX2e'
but this is `LaTeX2e'.

原因は Tex ソースで、ドキュメントクラスに jsarticle を
設定していたことにあったようだ。
これを jarticle に変更したら通った。