カウンタを使ったループ処理

今年の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.