1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
/*
CompareArgs() works as such:
CompareArgs(3,1,2,3,1,2,3)
Where arg0 is 1/2 the number of the
remaining arguments.
And the arguments 1,2,3 and 1,2,3 are
treated as two separate lists of size
arg0 whose elements are compared to one
another.
ie. in this case CompareArgs checks that
arg1==arg4, arg2==arg5, arg3==arg6.
*/
.assembly extern legacy library mscorlib {}
.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration:
//[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )]
}
.method static vararg int32 CompareArgs(int32){
.locals(int32 currentindex, int32 loopconstant)
.maxstack 10
.try{
ldc.i4 1
stloc currentindex
ldarg 0
stloc loopconstant
LOOP: ldloc currentindex
ldc.i4 4
mul
arglist
add
unaligned. 0x1
ldind.i4
ldloc currentindex
ldloc loopconstant
add
ldc.i4 4
mul
arglist
add
unaligned. 0x1
ldind.i4
ceq
brfalse EXITWITHFAIL
ldloc currentindex
ldloc loopconstant
beq EXITWITHPASS
ldc.i4 1
ldloc currentindex
add
stloc currentindex
br LOOP
EXITWITHPASS:
leave SUCCESS
EXITWITHFAIL:
leave FAIL
}catch [mscorlib]System.NullReferenceException{
pop
leave FAIL
}
SUCCESS:
ldc.i4 0x64
ret
FAIL:
ldc.i4 0x0
REALLYDONE:
ret
}
//-------------------------
// Entry point - Main -
//-------------------------
.method static int32 main() {
.entrypoint
.locals ()
.maxstack 10
ldc.i4 1
ldc.i4 1
ldc.i4 1
call vararg int32 CompareArgs(int32,...,int32,int32)
brfalse FAIL
ldc.i4 4
ldc.i4 2
ldc.i4 3
ldc.i4 4
ldc.i4 5
ldc.i4 2
ldc.i4 3
ldc.i4 4
ldc.i4 5
call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32)
brfalse FAIL
PASS:
ldc.i4 0x64
ret
FAIL:
ldc.i4 0x0
ret
}
|