Concurrent Clean : ABCマシン(15) : e_system_sAP
e_system_sAPがなんなのか分からないと前に言っていたけれど、単純なことでした。
systemモジュールのAP関数のエントリーというだけのことでした。ただし、_system.abcファイルをのぞいても、そのエントリーは見つからないのです。
アセンブリの方(_system.s)を見ると、対応するエントリー名の呼び出しが消えているので、これはdescriptor情報に埋め込まれている関数を呼んでいるのではないかと推測。
e__system__nAP: movl %ecx,(%esi) movl $__reserve,(%ecx) movl 4(%ecx),%edx movl 8(%ecx),%ecx addl $4,%esi ea__AP: testb $2,(%edx) jne e_60 movl %ecx,(%esi) addl $4,%esi movl %edx,%ecx call (%edx) # jsr_eval 0 movl %ecx,%edx movl -4(%esi),%ecx subl $4,%esi e_60: movl (%edx),%ebp call 2(%ebp) # jsr e_system_sAP movl -4(%esi),%edx movl (%ecx),%ebp movl %ebp,(%edx) movl 4(%ecx),%ebp movl %ebp,4(%edx) movl 8(%ecx),%ebp movl %ebp,8(%edx) movl %edx,%ecx subl $4,%esi ret
コメントを付けたところが、関数呼び出し部分です。レジスタ上の計算でアドレスを求めているようすが分かります。
descriptorのデータ構造をアセンブリから読み取ってやれば、どういう意図で何を呼び出しているのかがもっとはっきりするはず。