0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

COMファイルのPSP先頭CD20hとは?call 0で呼び出してみる

Last updated at Posted at 2025-09-07

PSPとは

MS-DOS時代のEXEファイルはメモリ上に読みこまれる際、先頭256バイト(100h)に付随する情報が追加されます。
この付加情報をPSPと呼びます。
以下の図のように初期状態ではDSがこのPSPの先頭を指しており、CS=DS+10h(PSP分)となっています。
そしてd ds:0とすることでPSPの内容が確認出来ます。
image.png

デバッグで確認したところ、PSP先頭が0B28、CSがDS+10hの0B38になっており、次に実行される命令がCS:IPで指されることからPSPが256バイトであることが確認できます。

先頭のCD20とは何か

COMファイル実行時のPSP先頭は通常CD 20で、これはプログラム終了命令であり、C言語のreturnに相当する、プログラム終了のための割り込み命令です。

しかしEXEの場合はこのようにint 21を使ってプログラムを終了するためこのCD 20は、互換性のため残っている歴史的産物でしかありません。

1.asm
assume cs:codesg
codesg segment

mov ax,2000H
add ax,ax
mov ax,4c00H
int 21H

codesg ends
end
masm 1.asm
link 1.OBJ

実験としてINT21を使わずPSP内のINT20(CD20)を使ってプログラムを終了させてみます。
EXEはINT20で終了させることが出来ないようなので、EXEの全身であるCOMを使って実験を行います。
上のEXEはXPを使って実験しましたが、COMファイルを実行させるとうまく動作しなかった為、MS-DOS上で動作させます。
MS-DOS上でCOMファイルを生成するのは少し面倒な為、Ubuntu上でコンパイルします。
COMはEXEと違いヘッダー情報がなく、機械語のアセンブリだけの為、UbuntuのNASMから直接コンパイルが可能です。

hello.asm
org 100h

start:
    mov ah, 9
    mov dx, msg
    int 21h        ; 文字列表示

    call 0         ; PSP先頭(CD 20)へ跳ぶ

msg db 'Hi!$'
# コンパイル
nasm -f bin hello.asm -o hello.com

# 空のフロッピーイメージ作成 FAT12で初期化
dd if=/dev/zero of=floppy.img bs=512 count=2880
mkfs.fat -F 12 floppy.img

# フロッピーにhello.comを入れる
sudo mkdir /mnt/floppy
sudo mount -o loop floppy.img /mnt/floppy

sudo cp hello.com /mnt/floppy

sudo umount /mnt/floppy

## QEMUで起動
qemu-system-i386 -fda floppy.img -hda msdos_hdd.img -boot c

Hi! と表示され、プログラムは正常に終了してMS-DOSへ戻っています。
image.png

しかし、実際に当時の現場でPSP先頭のCD 20が本当に利用されていたのかどうかは、当時の技術者に聞かない限り断定できません。

最後に

PSPには他の情報も色々保存されています。
他の情報については、又別の機会に検証します

20250912追記

8086実機のMSDOS上で試しても動きました。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?