Dudas sobre el opcode 'ldc.i4'

Iniciado por Eleкtro, 27 Diciembre 2014, 21:09 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

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
Ldc_I4_1

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!








MCKSys Argentina

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 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 CA

O bien

20 CA 1A 0F 00

No recuerdo si los numeros se almacenan como bigendian o no.  ;D


Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."