Buenas!
Quizás esta pregunta sea algo absurda porque no entiendo mucho de este tema... no tengais contemplaciones conmigo :P
Recientemente descubrí que para que una función devolviese siempre True (1) era suficiente con modificar el opcode que guarda el valor
False (0) en la pila para convertirlo en
True (No 0), eso es algo obvio, pero no sabía como hacerlo, y ahí descubrí que dicho valor es igual al índice del opcode
ldc.i4, es decir, el opcode
ldc.i4.0 almacena un
0 a la pila (False), y el opcode
ldc.i4.1 almacena un
1 en la pila (True)
Eso es lo que nos cuenta la MSDN:
Ldc_I4_0 (http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4_0%28v=vs.110%29.aspx)
Ldc_I4_1 (http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4_1%28v=vs.110%29.aspx)
Cita de: http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4%28v=vs.110%29.aspxLdc_I4:
Pushes a supplied value of type int32 onto the evaluation stack as an int32.
Mi pregunta es, ¿por que el rango solo va desde
ldc.i4.0 hasta
ldc.i4.8?, quiero decir, ¿por que no hay un 9, y así hasta el máximo valor Int32?, ¿porque y con que finalidad solo hay 8 índices/valores pre-establecidos de este opcode?.
Saludos!
Hola!
Cita de: Eleкtro en 27 Diciembre 2014, 21:09 PM
Mi pregunta es, ¿por que el rango solo va desde ldc.i4.0 hasta ldc.i4.8?, quiero decir, ¿por que no hay un 9, y así hasta el máximo valor Int32?, ¿porque y con que finalidad solo hay 8 índices/valores pre-establecidos de este opcode?.
La verdad, creo que esta es una pregunta para los desarrolladores del CIL :P. De todas formas, si miras el listado (http://en.wikipedia.org/wiki/List_of_CIL_instructions) de opcodes (en la parte de
ldc.i4) verás que no solo hay constantes de 0 a 8, sinó que también está el -1. Incluso hay una
forma corta (short form) de pushear valores de 32 bits al stack de la VM (
ldc.i4.s, opcode 0x1F).
Con respecto al
ldc.i4, si miraras la secuencia (en bytes) de opcodes para pushear, por ej., el valor 0X000F1ACA, verías algo como:
20 00 0F 1A CAO bien
20 CA 1A 0F 00No recuerdo si los numeros se almacenan como bigendian o no. ;D
Saludos!