2019-11-02 - In IL: Other Instructions
In IL
- Part 1 - Introduction
- Part 2 - Variables and Types
- Part 3 - Variables in Visual Basic .NET
- Part 4 - Instructions and the Stack
- Part 5 - Volume of a Cylinder (Operations)
- Part 6 - Branching Instructions
- Part 7 - Largest of Two Numbers (if-else)
- Part 8 - Largest of Three Numbers (If-ElseIf-Else)
- Part 9 - Switch instruction
- Part 10 - Grade Analyser (switch)
- Part 11 - Prize Calculator (switch-2)
- Part 12 - VB Grade Analyser (Select)
- Part 13 - Loop Instructions
- Part 14 - Print the Alphabet (while)
- Part 15 - Print the Alphabet (do while, for)
- Part 16 - Print the Alphabet (Do Until)
- Part 17 - Print the Alphabet (break, continue)
- Part 18 - Array Instructions
- Part 19 - Summing Arrays
- Part 20 - Other Instructions
- Part 21 - Assemblies
- Part 22 - Class Definitions
- Part 23 - C# Classes and Structs
- Part 24 - VB Classes, Modules and Structures
- Part 25 - Field Definitions
- Part 26 - Field Declarations
We've talked about a bunch of instructions so far but there were some simple ones that were either skipped or missed. I want to take the time now to go through those instructions.
ldloca (LoaD LOCal variable Address)
Push the address of a local variable onto the stack.
Instruction | Description | Binary Format |
---|---|---|
ldcloca.s <index> | Loads the address of local variable with “short” index <index> onto the stack | 0x12 <uint8> |
ldcloca <index> | Loads the address of local variable with index <index> onto the stack | 0xFE 0x0D <uint16> |
dup (Duplicate), pop
Both these instructions are used to modify the stack
Instruction | Description | Binary Format |
---|---|---|
dup | Duplicates the value at the top of the stack | 0x25 |
pop | Removes the value at the top of the stack | 0x26 |
add (ADDition), sub (SUBtraction), mul (MULtiplication), div (DIVision), rem (REMainder)
Pops two values off of the stack and pushes the result of the specified action onto the stack.
Instruction | Description | Binary Format |
---|---|---|
div.un | Divides the second value popped off of the stack by the first value popped off of the stack and pushes the result onto the stack. Both values are taken as unsigned integers | 0x5C |
rem | Divides the second value popped off of the stack by the first value popped off of the stack and pushes the remainder onto the stack. | 0x5D |
rem.un | Divides the second value popped off of the stack by the first value popped off of the stack and pushes the remainder onto the stack. Both values are taken as unsigned integers | 0x5E |
add.ovf | Adds the first value popped off of the stack to the second value popped off of the stack and pushes the result onto the stack. Throws exception if overflow occurs. | 0xD6 |
add.ovf.un | Adds the first value popped off of the stack to the second value popped off of the stack and pushes the result onto the stack. Both values are taken as unsigned integers and throws exception if overflow occurs. | 0xD7 |
mul.ovf | Multiplies the second value popped off of the stack by the first value popped off of the stack and pushes the result onto the stack. Throws exception if overflow occurs. | 0xD8 |
mul.ovf.un | Multiplies the second value popped off of the stack by the first value popped off of the stack and pushes the result onto the stack. Both values are taken as unsigned integers and throws exception if overflow occurs. | 0xD9 |
sub.ovf | Subtracts the first value popped off of the stack from the second value popped off of the stack and pushes the result onto the stack. Throws exception if overflow occurs. | 0xDA |
sub.ovf.un | Subtracts the first value popped off of the stack from the second value popped off of the stack and pushes the result onto the stack. Both values are taken as unsigned integers and throws exception if overflow occurs. | 0xDB |
shl (SHift Left), shr (SHift Right)
Pops two values off of the stack and shifts the second binary value popped off of the stack a number of times determined by the first value popped off of the stack pushing the result onto the stack.
Instruction | Description | Binary Format |
---|---|---|
shl | Shifts the value to the left, adding 0s to the right | 0x62 |
shr | Shifts the value to the right, adding duplicates of the sign bit to the left | 0x63 |
shr.un | Shifts the value to the right, adding 0s to the left. | 0x64 |
neg (negate)
Pops a value off of the stack and pushes the negative of that value onto the stack.
Instruction | Description | Binary Format |
---|---|---|
neg | Negates the value | 0x65 |
conv (CONVersion)
Pops a value off of the stack, converts it to the type based on the specific instruction used and pushes the result onto the stack.
Instruction | Description | Binary Format |
---|---|---|
conv.r.un | Converts unsigned integer value on the stack to a floating point number | 0x76 |
conv.ovf.i1.un | Converts the unsigned value on the stack to a 1-byte integer and throws exception if overflow | 0x82 |
conv.ovf.i2.un | Converts the unsigned value on the stack to a 2-byte integer and throws exception if overflow | 0x83 |
conv.ovf.i4.un | Converts the unsigned value on the stack to a 4-byte integer and throws exception if overflow | 0x84 |
conv.ovf.i8.un | Converts the unsigned value on the stack to a 8-byte integer and throws exception if overflow | 0x85 |
conv.ovf.u1.un | Converts the unsigned value on the stack to a 1-byte unsigned integer and throws exception if overflow | 0x86 |
conv.ovf.u2.un | Converts the unsigned value on the stack to a 2-byte unsigned integer and throws exception if overflow | 0x87 |
conv.ovf.u4.un | Converts the unsigned value on the stack to a 4-byte unsigned integer and throws exception if overflow | 0x88 |
conv.ovf.u8.un | Converts the unsigned value on the stack to a 8-byte unsigned integer and throws exception if overflow | 0x89 |
conv.ovf.i.un | Converts the unsigned value on the stack to a native sized integer and throws exception if overflow | 0x8A |
conv.ovf.u.un | Converts the unsigned value on the stack to a native sized unsigned integer and throws exception if overflow | 0x8B |
conv.ovf.i1 | Converts the value on the stack to a 1-byte integer and throws an exception if overflow occurs | 0xB3 |
conv.ovf.u1 | Converts the value on the stack to a 1-byte unsigned integer and throws exception if overflow | 0xB4 |
conv.ovf.i2 | Converts the value on the stack to a 2-byte integer and throws exception if overflow | 0xB5 |
conv.ovf.u2 | Converts the value on the stack to a 2-byte unsigned integer and throws exception if overflow | 0xB6 |
conv.ovf.i4 | Converts the value on the stack to a 4-byte integer and throws exception if overflow | 0xB7 |
conv.ovf.u4 | Converts the value on the stack to a 4-byte unsigned integer and throws exception if overflow | 0xB8 |
conv.ovf.i8 | Converts the value on the stack to a 8-byte integer and throws exception if overflow | 0xB9 |
conv.ovf.u8 | Converts the value on the stack to a 8-byte unsigned integer and throws exception if overflow | 0xBa |
conv.i | Converts the value on the stack to a native sized integer | 0xD3 |
conv.ovf.i | Converts the value on the stack to a native sized integer and throws exception if overflow | 0xD4 |
conv.ovf.u | Converts the value on the stack to a native sized unsigned integer and throws exception if overflow | 0xD5 |
conv.u | Converts the value on the stack to a native sized unsigned integer | 0xE0 |
unbox
Pops a reference-type value off of the stack, unboxes it as the specified value type and pushes the result onto the stack.
Instruction | Description | Binary Format |
---|---|---|
unbox <type> | Unboxes the value on the stack as the specified type | 0x79 <T> |
Ckfinite (ChecK INfinITE)
Pops a floating-point value off of the stack, checks if that value is Not-A-Number or infinity and throws an exception if it is, otherwise it pushes the value back onto the stack.
Instruction | Description | Binary Format |
---|---|---|
Ckfinite | Throw exception if NaN or Infinity | 0xC3 |
Now that we understand that basic instructions used to generate programs we can pull back and start looking at how programs are structured.
Comments: