カウンタを使ったループ処理
今年のNFLスーパーボールは,ピッツバーグの勝ち.Seattle SeaHowksは残念ながら負けてしまいました.スコアは21-10かな.
アセンブリコード
;loop.asm bits 16 org 0x100 mov ah, 0x09 mov dx, msg mov cx, 0x3 doit: int 21h loop doit mov ax, 0x4C00 int 21h msg db 0x40, 0x40, 0x40, 0x0D, 0x0A, 0x24
アセンブルと実行結果
D:\asmwork>nasm -f bin loop.asm -o loop.com D:\asmwork>loop.com @@@ @@@ @@@
レジスタCXの値はループするごとに1ずつ自動的に減算されていく.forループでi++するのが当然の高級言語文化に浸っていた身からするとかなり新鮮.
バイナリコード
ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ------------------------------------------------------------------------------ 00000000 B4 09 BA 11 01 B9 03 00 CD 21 E2 FC B8 00 4C CD エ.コ..ケ..ヘ!紆ク.Lヘ 00000010 21 40 40 40 0D 0A 24 !@@@..$
0x02-0x03のところでの"BA 11"で"mov dx, msg"の処理."BA"は"mov dx"を意味し,後続の"11"はmsgの本体の先頭アドレス,即ち0x11.msgという変数はバイナリコード上には存在しない.アドレス0x11から値0x24が出現するまでの間がこれに相当.現時点で理解不能なのが0x04のところにある"0x01"というやつ.これは一体何者.コード0x05- 0x09までは既出なのでOK.0x0A-0x0Bがまた意味不明.その後は既出なのでOK.