#include "loadlib.as" ;================================================================================= ; ; 機械語使って1からXまでの和を求める ; ;================================================================================= ;機械語 ll_getptr proc_sum : ll_ret p_sum p = p_sum ll_poke4 $8b4c2404,p,1 : p+=4 ;mov ecx,[esp+4] ll_poke2 $33c0,p,1 : p+=2 ;xor eax,eax ll_poke1 $eb,p : p+ : ll_poke1 3,p :p+ ;jmp __jmp1 ;__jmp2 ll_poke2 $03c1,p,1 : p+=2 ;add eax,ecx ll_poke1 $49,p : p+ ;dec ecx ;__jmp1 ll_poke2 $85c9,p,1 : p+=2 ;test ecx,ecx ll_poke1 $7f,p : p+ : ll_poke1 -7,p :p+ ;jg __jmp2 ll_poke1 $c3,p : p+ ;ret ;*変数proc内の機械語のサイズ size=p-p_proc ;機械語をファイルに保存しておく ;size=p-p_sum ;bsave "_numadd.mcn",proc_sum,size ;HSPは速いので、小さい数だと違いが分からないから大きい数で試してみる ; *NUM_Xの最大は1090735 これ以上だとオーバーフローする #define X 1000000 mes "1から"+X+"までの和" mes " " mes "機械語で作ったものでの計算 開始" mes "計算中..." param=X ll_callfunc param,1,p_sum : ll_ret sum1 mes " sum1="+sum1 mes " " mes "HSP標準の命令での計算 開始" mes "計算中..." repeat X : sum2+=cnt : loop mes " sum2="+sum2 mes " " mes "C magagineに載っていた計算法 開始" mes "計算中..." sum3=2*((X/2)*((X+1)/2))+((X+1)/2) mes " sum3="+sum3 mes " " dialog "終了 end ;おそらくハンドアセンブルが簡単だと言う人はいないと思うので ;(できる人もほとんどいない?)アセンブリで書いたものをMASMなどでアセンブルし、 ;リストファイルを出力させてください。 ;MASMを持っていない人は ; http://www.microsoft.com/ddk/ ;で'The Windows DDK'をクリックして ; http://www.microsoft.com/ddk/W2kDDK.asp ;に行き、下の方の ;[I Accept this License Agreement for the Windows DDK]を押して移動した所にある ;DDK_xBns.exe(2.7MB)というファイルにMASM(ml.exe)が入っています。(2001/08/02現在) ;このサンプルを例につかうと、下のように書いたものをsample.asmという ;ファイルに保存し、MS-DOS プロンプトで ; ml /Flsample_list.txt /c sample.asm ;と打てばsample_list.txtというリストファイルができます。 ;(MS-DOS プロンプトがよく分からない人はHSPで ; ml = "c:\\ml\\ml.exe" ; ml.exeのあるフォルダ ; chdir "c:\\asm" ; sample.asmがあるフォルダ ; exec ml+" /Flsample_list.txt /c sample.asm", 1+2 ;タスク待ち+最小化モード ;を実行してもできます。) ;アセンブリについては本などで勉強してみてください。 ;;sample.asm ; .386 ; .model flat ; .code ; mov ecx,[esp+4] ; xor eax,eax ; jmp __jmp1 ;__jmp2: ; add eax,ecx ; dec ecx ;__jmp1: ; test ecx,ecx ; jg __jmp2 ; ret ; end ;ハンドアセンブルに興味のある人はvectorのMS-DOS->アセンブラの所にある、 ;dias16.exeというプログラムに含まれている80x86のインストラクションセットの ;コード表が書かれたファイルが参考になると思います。