PUSHとPOP
; 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だ多分.