Skip to content

Instantly share code, notes, and snippets.

@orange-in-space
Created May 1, 2024 10:04
Show Gist options
  • Save orange-in-space/479c525c7f5196857e4c57a0a69fbb78 to your computer and use it in GitHub Desktop.
Save orange-in-space/479c525c7f5196857e4c57a0a69fbb78 to your computer and use it in GitHub Desktop.
Calculate sine written in CIL practice(CIL/MSILで自前でサインを計算する練習コード><)
.assembly extern mscorlib {}
.assembly 'App' {}
// Calculate sine written in CIL practice
//(C) orange_in_space
//MIT License
//
//This code is just for practice for me><;
// Assemble
// >ilasm thisfile.il
.method private hidebysig static void Main ( string[] args) cil managed {
.entrypoint
ldstr "Sin Calc CIL"
call void [mscorlib]System.Console::WriteLine(string)
//If you want to try with other values, please change here.
ldc.r8 1.42
//
ldstr "Sin("
call void [mscorlib]System.Console::Write(string)
dup
call void [mscorlib]System.Console::Write(float64)
ldstr ") is"
call void [mscorlib]System.Console::WriteLine(string)
call float64 Sin(float64)
call void [mscorlib]System.Console::WriteLine(float64)
ret
}
.method public static float64 Sin(float64){
ldarg.0
ldarg.0
ldc.i8 3
call float64 TaylorElement(float64,int64)
sub
ldarg.0
ldc.i8 5
call float64 TaylorElement(float64,int64)
add
ldarg.0
ldc.i8 7
call float64 TaylorElement(float64,int64)
sub
ldarg.0
ldc.i8 9
call float64 TaylorElement(float64,int64)
add
ldarg.0
ldc.i8 11
call float64 TaylorElement(float64,int64)
sub
ldarg.0
ldc.i8 13
call float64 TaylorElement(float64,int64)
add
ldarg.0
ldc.i8 15
call float64 TaylorElement(float64,int64)
sub
ldarg.0
ldc.i8 17
call float64 TaylorElement(float64,int64)
add
ldarg.0
ldc.i8 19
call float64 TaylorElement(float64,int64)
sub
ldarg.0
ldc.i8 21
call float64 TaylorElement(float64,int64)
add
ret
}
//TaylorElement(double x,int degree)
.method public static float64 TaylorElement(float64,int64){
ldarg.0
ldarg.1
call float64 Pow(float64,int64);
ldarg.1
call int64 Factorial(int64)
conv.r8
div
ret
}
// pow(double x , int y)
.method public static float64 Pow(float64,int64){
.locals init (
[0] float64, //var_0
[1] int64 // loopcounter
)
ldarg.0
stloc.0
ldarg.1
stloc.1
loop_next:
ldloc.1
ldc.i8 -1
add
//printf debug
//dup
//call void [mscorlib]System.Console::WriteLine(int64)
//
dup
stloc.1
brfalse loop_end
// var_0 * arg_0
ldloc.0
ldarg.0
mul
stloc.0
br loop_next
loop_end:
ldloc.0
ret
}
.method public static int64 Factorial(int64){
.locals init (
[0] int64, // result
[1] int64 // loop_counter
)
ldarg.0
brfalse return_Zero //if zero then zero
ldc.i8 1
stloc.0 // result =1
ldarg.0
stloc.1 //set loop_counter
loop_next:
ldloc.1
ldc.i8 -1
add
dup
stloc.1
brfalse loop_end // loop exit
ldloc.0
ldloc.1
ldc.i8 1
add
mul // (result * loop_counter+1)
stloc.0
br loop_next
loop_end:
ldloc.0
ret
return_Zero:
ldc.i8 0
ret
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment