作成: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 逆アセンブラ アドレス 機械語 ニーモニック
-t1命令ずつトレース
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
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)