作成:2000-02-21

更新:2000-06-23

「僕は先輩みたいに大昔からパソコンをやってないんですよ。僕のパソコンじゃアセンブラなんて使えません」 なんて事を平気で言う近頃の若いモノへのページ(笑)

イヤ別に無理も無い話しで、別に苦言じゃないんだが、この頃の若いものはMSDOSなんて殆ど知らずにWindows使ってるのかもな〜って思っているところへ、この騒ぎ(笑 )なんでちょっとお遊び。

まずWindowsのスタートからMS-DOSプロンプトを起動して、こんな感じで

アセンブラで2+3=5っていうのを計算してみよう(笑)

例によって太文字が打ちこむコマンドで、青が出力だ。特に太文字の青に注目だ。緑はコメント


C:\WINDOWS>cd \
C:\>mkdir home
C:\>cd home 別に実行フォルダはどこでもいいんだが、なんとなくc:\windowsとか、c:\とかそういう大事なディレクトリじゃないほうがいいような

C:\home>debug debugっていうのは簡易的なアセンブラ、逆アセンブラ、メモリへの値入力、プログラムトレース、ブレークがついているのな。
-a 100 アドレスの100番地からアセンブラでプログラムを書いて行く。なぜ100番かは、話しが長くなるので省略(comモデルだから、と思ったが覚えてねぇや)
251E:0100 nop NoOperation:何もしない。トレースの時に命令が見やすいように。
251E:0101 mov ax,2 レジスタ変数(という事にしておく)axに2を入れる
251E:0104 mov bx,3 レジスタ変数(という事にしておく)bxに3を入れる
251E:0107 add ax,bx ax = ax + bx
251E:0109 ret なんとなく。

-rip  プログラムカウンタを100にセットしておく
IP 0100
:100

-u 100,109 逆アセンブラ アドレス  機械語 ニーモニック
251E:0100 90 NOP
251E:0101 B80200 MOV AX,0002
251E:0104 BB0300 MOV BX,0003
251E:0107 01D8 ADD AX,BX
251E:0109 C3 RET

-t1命令ずつトレース

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=251E ES=251E SS=251E CS=251E IP=0101 NV UP EI PL NZ NA PO NC
251E:0101 B80200 MOV AX,0002
←今から、この命令を行いますよ。見ててね。
-
t

↓(うぉお、AXに2が入った!)
AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=251E ES=251E SS=251E CS=251E IP=0104 NV UP EI PL NZ NA PO NC
251E:0104 BB0300 MOV BX,0003
-
t

(うぉお、BXに3が入った!)
AX=0002 BX=0003 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=251E ES=251E SS=251E CS=251E IP=0107 NV UP EI PL NZ NA PO NC
251E:0107 01D8 ADD AX,BX
-
t

↓(AX=AX+BXでAXに5が入った!そうか。2+3=5なんだね!)
AX=0005 BX=0003 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=251E ES=251E SS=251E CS=251E IP=0109 NV UP EI PL NZ NA PE NC
251E:0109 C3 RET
-
q おしまい

C:\home>debug 面白いので、もっとだ!。

アセンブラで6-3=3 , 3-3=0 , 0-3=-3 っていうのを計算してみよう

-a 100 

2724:0100 NOP
2724:0101 MOV AX,6
2724:0104 MOV BX,3
2724:0107 SUB AX,BX
2724:0109 SUB AX,BX
2724:010B SUB AX,BX
2724:010D    (ここでENTERだけを押してアセンブラから抜ける)

-RIP (プログラムカウンタを念の為、100にセットする)
IP 0100
:100
-T   (トレース:1コマンドずつ実行:を行う)

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2724 ES=2724 SS=2724 CS=2724 IP=0101 NV UP EI PL NZ NA PO NC

                                      ↑ここがフラグの表示部分
2724:0101 B80600 MOV AX,0006 ←Tコマンドにより実行される命令
                     (まだ実行されていない事に注意)

-T

AX=0006 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2724 ES=2724 SS=2724 CS=2724 IP=0104 NV UP EI PL NZ NA PO NC
2724:0104 BB0300 MOV BX,0003

AX ← 06 が入る。
-T

AX=0006 BX=0003 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2724 ES=2724 SS=2724 CS=2724 IP=0107 NV UP EI PL NZ NA PO NC
2724:0107 29D8 SUB AX,BX

BX ← 03 が入る。
-t

AX=0003 BX=0003 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2724 ES=2724 SS=2724 CS=2724 IP=0109 NV UP EI PL NZ NA PE NC
2724:0109 29D8 SUB AX,BX

★6-3=3 が AXに入る。ゼロフラグはクリア(NZ) キャリーはクリア(NC)
-t

AX=0000 BX=0003 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2724 ES=2724 SS=2724 CS=2724 IP=010B NV UP EI PL ZR NA PE NC
2724:010B 29D8 SUB AX,BX

★3-3=0 が AXに入る。0になったのでゼロフラグが立つ↑(NZ->ZR)

AX=FFFD BX=0003 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2724 ES=2724 SS=2724 CS=2724 IP=010D NV UP EI NG NZ AC PO CY
2724:010D 90 NOP

★0-3=-3 = FFFD がAXに入る。マイナスになってキャリーフラグが立つ↑NC->CY)


感動に震えつつ戻る