PUSHとPOP

ソースコード.無意味に32bitレジスタ使ってます.

; PushPop.asm
  
  mov eax, 0x00000200
  mov edx, 0x00000065 ; char='e'
  push edx
  mov edx, 0x00000067 ; char='g'
  push edx
  mov edx, 0x0000006F ; char='o'
  push edx
  mov edx, 0x00000068 ; char='h'
  int 0x21
  pop edx
  int 0x21
  pop edx
  int 0x21
  pop edx
  int 0x21
  
  mov eax, 0x00004C00
  int 0x21

実行結果はこちら.ちゃんと"hoge"が出ました.

D:\asmwork>nasm -f bin PushPop.asm -o PushPop.com

D:\asmwork>PushPop.com
hoge
D:\asmwork>

余興でバイナリコードを読んでみる.

ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF 
-----------------------------------------------------------------------------
00000000  66 B8 00 02 00 00 66 BA 65 00 00 00 66 52 66 BA   fク....fコe...fRfコ 
00000010  67 00 00 00 66 52 66 BA 6F 00 00 00 66 52 66 BA   g...fRfコo...fRfコ 
00000020  68 00 00 00 CD 21 66 5A CD 21 66 5A CD 21 66 5A   h...ヘ!fZヘ!fZヘ!fZ 
00000030  CD 21 66 B8 00 4C 00 00 CD 21                     ヘ!fク.L..ヘ!       

"00 02 00 00"は"0x00000200"(4バイト分)をリトルエンディアンで表したやつ,同様にして"65 00 00 00"が'e',"67 00 00 00"が'g',"6F 00 00 00"が'o','68 00 00 00"が'h'だね.

"66 B8"でeaxにmovを意味するんだと思う."mov"と"eax"が別々にあるわけではないと."66 BA"でedxにmov."CD 21"が"int 0x21"ってのはこのままで良さそうだ."66 52"でedxをpush、"66 5A"でedxにpopだ多分.