home comics writing pictures archive about

2019-11-02 - In IL: Other Instructions

In IL

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: