Ir al contenido

Referencia del Conjunto de Instrucciones

Esta página es la referencia autoritativa para cada instrucción en el conjunto de instrucciones del bytecode de Move tal como las ejecuta el MoveVM de Aptos. Está dirigida a desarrolladores que construyen intérpretes de bytecode, desensambladores, analizadores estáticos, o cualquier persona que necesite entender exactamente lo que hace la VM para cada opcode.

El MoveVM es una máquina virtual basada en stack. Cada invocación de función crea un nuevo frame que contiene:

  • Un stack de operandos donde se apilan y desapilan valores intermedios.
  • Un arreglo de locales indexado por LocalIndex (u8), que contiene los parámetros de función y las variables locales.
  • Un contador de programa (PC) que apunta a la instrucción actual en el cuerpo de la función.

Las instrucciones consumen operandos de la parte superior del stack, realizan cálculos y apilan los resultados. Las instrucciones de flujo de control modifican el PC. La instrucción Call crea un nuevo frame en el stack de llamadas; Ret destruye el frame actual y retorna al invocador.

Para una descripción de los tipos que pueden tener los valores, consulta la página del Sistema de Tipos. Para el diseño binario de un módulo compilado, consulta la página del Formato de Módulo.

Cada entrada de instrucción documenta lo siguiente:

CampoSignificado
OpcodeEl valor del byte hexadecimal que identifica la instrucción en el flujo de bytecode.
OperandosValores inmediatos codificados después del byte del opcode (índices, constantes, desplazamientos).
Efecto en el stackValores consumidos (desapilados) y producidos (apilados). Notación: [..., a, b] significa que a se apiló primero y b está en la parte superior. La flecha muestra la transición: [..., a, b] -> [...] significa que tanto a como b se desapilan; [...] -> [..., c] significa que c se apila.
DescripciónComportamiento y condiciones de error.
DesdeVersión del bytecode que introdujo la instrucción, si es posterior a v5 (la versión mínima soportada).

Los operandos de índice se codifican como enteros ULEB128 en el flujo de bytecode a menos que se indique lo contrario. Los valores enteros inmediatos (p. ej., el valor para LdU64) se codifican en formato little-endian de ancho fijo correspondiente al ancho de su tipo.

La tabla siguiente enumera cada instrucción con su opcode y un resumen de una línea. Haz clic en el nombre de la instrucción para ir a su entrada detallada.

OpcodeInstrucciónResumen
0x01PopDescartar el valor superior del stack.
0x02RetRetornar de la función actual.
0x03BrTrueBifurcar si el tope del stack es true.
0x04BrFalseBifurcar si el tope del stack es false.
0x05BranchBifurcación incondicional.
0x06LdU64Apilar un u64 inmediato.
0x07LdConstApilar un valor del pool de constantes.
0x08LdTrueApilar true.
0x09LdFalseApilar false.
0x0ACopyLocCopiar un local al stack.
0x0BMoveLocMover un local al stack.
0x0CStLocDesapilar y almacenar en un local.
0x0DMutBorrowLocApilar referencia &mut a un local.
0x0EImmBorrowLocApilar referencia & a un local.
0x0FMutBorrowFieldPréstamo mutable de un campo de struct.
0x10ImmBorrowFieldPréstamo inmutable de un campo de struct.
0x11CallLlamar a una función por índice de handle.
0x12PackCrear una instancia de struct.
0x13UnpackDestruir un struct, apilar sus campos.
0x14ReadRefDesreferenciar y copiar.
0x15WriteRefEscribir a través de una referencia mutable.
0x16AddSuma de enteros.
0x17SubResta de enteros.
0x18MulMultiplicación de enteros.
0x19ModMódulo de enteros.
0x1ADivDivisión de enteros.
0x1BBitOrOR a nivel de bits.
0x1CBitAndAND a nivel de bits.
0x1DXorXOR a nivel de bits.
0x1EOrOR booleano.
0x1FAndAND booleano.
0x20NotNegación booleana.
0x21EqPrueba de igualdad.
0x22NeqPrueba de desigualdad.
0x23LtMenor que.
0x24GtMayor que.
0x25LeMenor o igual que.
0x26GeMayor o igual que.
0x27AbortAbortar con código de error.
0x28NopSin operación.
0x29ExistsProbar si existe un recurso en una dirección.
0x2AMutBorrowGlobalPréstamo mutable de un recurso global.
0x2BImmBorrowGlobalPréstamo inmutable de un recurso global.
0x2CMoveFromEliminar un recurso del almacenamiento global.
0x2DMoveToPublicar un recurso en almacenamiento global.
0x2EFreezeRefConvertir &mut T a &T.
0x2FShlDesplazamiento a la izquierda.
0x30ShrDesplazamiento a la derecha.
0x31LdU8Apilar un u8 inmediato.
0x32LdU128Apilar un u128 inmediato.
0x33CastU8Convertir a u8.
0x34CastU64Convertir a u64.
0x35CastU128Convertir a u128.
0x36MutBorrowFieldGenericPréstamo mutable genérico de campo.
0x37ImmBorrowFieldGenericPréstamo inmutable genérico de campo.
0x38CallGenericLlamar a una instanciación de función genérica.
0x39PackGenericCrear una instancia de struct genérico.
0x3AUnpackGenericDestruir un struct genérico, apilar sus campos.
0x3BExistsGenericPrueba genérica de existencia de recurso.
0x3CMutBorrowGlobalGenericPréstamo mutable global genérico.
0x3DImmBorrowGlobalGenericPréstamo inmutable global genérico.
0x3EMoveFromGenericEliminación genérica de recurso.
0x3FMoveToGenericPublicación genérica de recurso.
0x40VecPackCrear un vector desde valores del stack.
0x41VecLenObtener la longitud del vector.
0x42VecImmBorrowPréstamo inmutable de elemento del vector.
0x43VecMutBorrowPréstamo mutable de elemento del vector.
0x44VecPushBackAgregar al vector.
0x45VecPopBackEliminar el último elemento del vector.
0x46VecUnpackDestruir vector, apilar todos los elementos.
0x47VecSwapIntercambiar dos elementos del vector.
0x48LdU16Apilar un u16 inmediato.
0x49LdU32Apilar un u32 inmediato.
0x4ALdU256Apilar un u256 inmediato.
0x4BCastU16Convertir a u16.
0x4CCastU32Convertir a u32.
0x4DCastU256Convertir a u256.
0x4EImmBorrowVariantFieldPréstamo inmutable de campo de variante (v7).
0x4FMutBorrowVariantFieldPréstamo mutable de campo de variante (v7).
0x50ImmBorrowVariantFieldGenericPréstamo inmutable genérico de campo de variante (v7).
0x51MutBorrowVariantFieldGenericPréstamo mutable genérico de campo de variante (v7).
0x52PackVariantCrear una variante de enum (v7).
0x53PackVariantGenericCrear una variante genérica de enum (v7).
0x54UnpackVariantDestruir una variante de enum, apilar campos (v7).
0x55UnpackVariantGenericDestruir una variante genérica de enum (v7).
0x56TestVariantProbar si un valor es una variante dada (v7).
0x57TestVariantGenericPrueba genérica de variante (v7).
0x58PackClosureCrear un closure (v8).
0x59PackClosureGenericCrear un closure genérico (v8).
0x5ACallClosureInvocar un closure (v8).
0x5BLdI8Apilar un i8 inmediato (v9).
0x5CLdI16Apilar un i16 inmediato (v9).
0x5DLdI32Apilar un i32 inmediato (v9).
0x5ELdI64Apilar un i64 inmediato (v9).
0x5FLdI128Apilar un i128 inmediato (v9).
0x60LdI256Apilar un i256 inmediato (v9).
0x61CastI8Convertir a i8 (v9).
0x62CastI16Convertir a i16 (v9).
0x63CastI32Convertir a i32 (v9).
0x64CastI64Convertir a i64 (v9).
0x65CastI128Convertir a i128 (v9).
0x66CastI256Convertir a i256 (v9).
0x67NegateNegar un entero con signo (v9).
0x68AbortMsgAbortar con código de error y mensaje (v10).

Estas instrucciones manipulan el stack de operandos directamente — apilando constantes, cargando desde el pool de constantes o descartando valores.

Opcode0x01
OperandosNinguno
Stack[..., value] -> [...]

Desapila y descarta el valor superior del stack. El valor debe tener la ability drop.

Opcode0x08
OperandosNinguno
Stack[...] -> [..., true]

Apila el valor booleano true en el stack.

Opcode0x09
OperandosNinguno
Stack[...] -> [..., false]

Apila el valor booleano false en el stack.

Opcode0x31
Operandosu8_value (1 byte)
Stack[...] -> [..., u8_value]

Apila la constante u8 dada en el stack. El byte inmediato sigue directamente al opcode.

Opcode0x48
Operandosu16_value (2 bytes, little-endian)
Stack[...] -> [..., u16_value]

Apila la constante u16 dada en el stack.

Opcode0x49
Operandosu32_value (4 bytes, little-endian)
Stack[...] -> [..., u32_value]

Apila la constante u32 dada en el stack.

Opcode0x06
Operandosu64_value (8 bytes, little-endian)
Stack[...] -> [..., u64_value]

Apila la constante u64 dada en el stack.

Opcode0x32
Operandosu128_value (16 bytes, little-endian)
Stack[...] -> [..., u128_value]

Apila la constante u128 dada en el stack.

Opcode0x4A
Operandosu256_value (32 bytes, little-endian)
Stack[...] -> [..., u256_value]

Apila la constante u256 dada en el stack.

Opcode0x07
Operandosconst_idx (ULEB128 — ConstantPoolIndex)
Stack[...] -> [..., constant_value]

Carga una constante del pool de constantes del módulo, la deserializa según su tipo declarado y apila el valor resultante en el stack. La entrada del pool de constantes almacena tanto los bytes serializados como la firma de tipo.

Opcode0x28
OperandosNinguno
Stack[...] -> [...]

Sin operación. El PC avanza uno. Esta instrucción puede servir como marcador de posición o relleno de alineación en el flujo de bytecode.


Estas instrucciones transfieren valores entre el stack de operandos y el arreglo de locales del frame.

Opcode0x0A
Operandoslocal_idx (u8)
Stack[...] -> [..., value]

Copia el valor almacenado en locals[local_idx] y lo apila en el stack. El local permanece válido para uso posterior. El tipo del local debe tener la ability copy.

Opcode0x0B
Operandoslocal_idx (u8)
Stack[...] -> [..., value]

Mueve el valor de locals[local_idx] al stack. Después de esta instrucción, el local queda invalidado. Cualquier lectura del local antes de un StLoc posterior a ese índice es un error de verificación.

Opcode0x0C
Operandoslocal_idx (u8)
Stack[..., value] -> [...]

Desapila el valor superior del stack y lo almacena en locals[local_idx]. Si el local ya contiene un valor, ese valor anterior se descarta (el tipo debe tener la ability drop en ese caso). El tipo del valor debe coincidir con el tipo declarado del local.

Opcode0x0D
Operandoslocal_idx (u8)
Stack[...] -> [..., &mut T]

Apila una referencia mutable a locals[local_idx] en el stack. El local debe contener actualmente un valor válido.

Opcode0x0E
Operandoslocal_idx (u8)
Stack[...] -> [..., &T]

Apila una referencia inmutable a locals[local_idx] en el stack.


Estas instrucciones interactúan con el almacenamiento global de recursos — el almacén persistente clave-valor indexado por pares (address, type). Los tipos struct utilizados deben tener la ability key.

Opcode0x29
Operandosstruct_def_idx (ULEB128 — StructDefinitionIndex)
Stack[..., address] -> [..., bool]

Desapila una dirección del stack y apila true si existe una instancia del tipo struct especificado en esa dirección en el almacenamiento global, false en caso contrario.

Opcode0x3B
Operandosstruct_inst_idx (ULEB128 — StructDefInstantiationIndex)
Stack[..., address] -> [..., bool]

Versión genérica de Exists. El operando indexa en la tabla de instanciación de struct que proporciona los argumentos de tipo concretos.

Opcode0x2C
Operandosstruct_def_idx (ULEB128 — StructDefinitionIndex)
Stack[..., address] -> [..., struct_value]

Desapila una dirección, elimina el recurso del tipo especificado del almacenamiento global en esa dirección y apila el valor en el stack. Aborta si no existe dicho recurso.

Opcode0x3E
Operandosstruct_inst_idx (ULEB128 — StructDefInstantiationIndex)
Stack[..., address] -> [..., struct_value]

Versión genérica de MoveFrom.

Opcode0x2D
Operandosstruct_def_idx (ULEB128 — StructDefinitionIndex)
Stack[..., signer_ref, struct_value] -> [...]

Desapila un valor struct y una referencia &signer del stack. Publica el valor struct en el almacenamiento global bajo la dirección del firmante. Aborta si un recurso del mismo tipo ya existe en esa dirección.

Opcode0x3F
Operandosstruct_inst_idx (ULEB128 — StructDefInstantiationIndex)
Stack[..., signer_ref, struct_value] -> [...]

Versión genérica de MoveTo.

Opcode0x2A
Operandosstruct_def_idx (ULEB128 — StructDefinitionIndex)
Stack[..., address] -> [..., &mut T]

Desapila una dirección, adquiere una referencia mutable al recurso del tipo especificado en esa dirección y apila la referencia. Aborta si el recurso no existe.

Opcode0x3C
Operandosstruct_inst_idx (ULEB128 — StructDefInstantiationIndex)
Stack[..., address] -> [..., &mut T]

Versión genérica de MutBorrowGlobal.

Opcode0x2B
Operandosstruct_def_idx (ULEB128 — StructDefinitionIndex)
Stack[..., address] -> [..., &T]

Desapila una dirección, adquiere una referencia inmutable al recurso del tipo especificado en esa dirección y apila la referencia. Aborta si el recurso no existe.

Opcode0x3D
Operandosstruct_inst_idx (ULEB128 — StructDefInstantiationIndex)
Stack[..., address] -> [..., &T]

Versión genérica de ImmBorrowGlobal.


Estas instrucciones toman prestados campos individuales de referencias a struct en el stack.

Opcode0x0F
Operandosfield_handle_idx (ULEB128 — FieldHandleIndex)
Stack[..., &mut Struct] -> [..., &mut FieldType]

Desapila una referencia mutable a un struct y apila una referencia mutable al campo identificado por el handle de campo. El handle de campo codifica tanto la definición del struct como el desplazamiento del campo dentro de ese struct.

Opcode0x36
Operandosfield_inst_idx (ULEB128 — FieldInstantiationIndex)
Stack[..., &mut Struct<T>] -> [..., &mut FieldType]

Versión genérica de MutBorrowField. La tabla de instanciación de campo proporciona los argumentos de tipo concretos para el struct.

Opcode0x10
Operandosfield_handle_idx (ULEB128 — FieldHandleIndex)
Stack[..., &Struct] -> [..., &FieldType] o [..., &mut Struct] -> [..., &FieldType]

Desapila una referencia inmutable o mutable a un struct y apila una referencia inmutable al campo especificado.

Opcode0x37
Operandosfield_inst_idx (ULEB128 — FieldInstantiationIndex)
Stack[..., &Struct<T>] -> [..., &FieldType] o [..., &mut Struct<T>] -> [..., &FieldType]

Versión genérica de ImmBorrowField.


Estas instrucciones desreferencian, escriben a través de o convierten referencias.

Opcode0x14
OperandosNinguno
Stack[..., &T] -> [..., T] o [..., &mut T] -> [..., T]

Desapila una referencia (mutable o inmutable), copia el valor referenciado y apila la copia en el stack. El tipo referenciado debe tener la ability copy.

Opcode0x15
OperandosNinguno
Stack[..., value, &mut T] -> [...]

Desapila una referencia mutable y un valor del stack, luego escribe el valor a través de la referencia. El valor anterior en esa ubicación se descarta, por lo que el tipo debe tener la ability drop. El tipo del valor debe coincidir con el tipo interno de la referencia.

Opcode0x2E
OperandosNinguno
Stack[..., &mut T] -> [..., &T]

Desapila una referencia mutable y la vuelve a apilar como referencia inmutable. Esta es una conversión solo a nivel de tipo — no se realiza trabajo en tiempo de ejecución más allá de la actualización del seguimiento de préstamos.


Todas las instrucciones aritméticas desapilan dos operandos enteros del mismo tipo del stack y apilan el resultado. Para tipos sin signo, Sub aborta por underflow y Add/Mul abortan por overflow. Para tipos con signo, tanto el overflow como el underflow causan un aborto aritmético. Div y Mod abortan cuando el divisor es cero. Div sobre enteros con signo también aborta por overflow (el valor mínimo dividido por -1).

Opcode0x16
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs + rhs. Aborta por overflow.

Opcode0x17
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs - rhs. Para tipos sin signo, aborta si lhs < rhs. Para tipos con signo, aborta por underflow.

Opcode0x18
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs * rhs. Aborta por overflow.

Opcode0x19
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs % rhs. Aborta si rhs == 0.

Opcode0x1A
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs / rhs (división entera, truncando hacia cero). Aborta si rhs == 0. Para tipos con signo, también aborta si lhs == MIN_VALUE && rhs == -1 (overflow).

Opcode0x67
OperandosNinguno
Stack[..., value] -> [..., result]
DesdeBytecode v9

Niega el entero con signo en la parte superior del stack. Calcula -value. Aborta si el valor es el mínimo de su tipo de entero con signo (p. ej., i8::MIN), porque la contraparte positiva no es representable.


Las instrucciones a nivel de bits operan sobre dos valores enteros del mismo tipo (excepto para operaciones de desplazamiento, donde la cantidad de desplazamiento siempre es u8).

Opcode0x1B
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs | rhs (OR a nivel de bits). Ambos operandos deben ser del mismo tipo entero.

Opcode0x1C
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs & rhs (AND a nivel de bits). Ambos operandos deben ser del mismo tipo entero.

Opcode0x1D
OperandosNinguno
Stack[..., lhs, rhs] -> [..., result]

Calcula lhs ^ rhs (XOR a nivel de bits). Ambos operandos deben ser del mismo tipo entero.

Opcode0x2F
OperandosNinguno
Stack[..., value, shift_amount] -> [..., result]

Desplaza value a la izquierda por shift_amount bits. El shift_amount debe ser de tipo u8 y debe ser menor que el ancho en bits del tipo del valor. Aborta con un error aritmético si la cantidad de desplazamiento está fuera de rango.

Opcode0x30
OperandosNinguno
Stack[..., value, shift_amount] -> [..., result]

Desplaza value a la derecha por shift_amount bits. El shift_amount debe ser de tipo u8 y debe ser menor que el ancho en bits del tipo del valor. Para enteros con signo, esto realiza un desplazamiento aritmético a la derecha (extensión de signo). Aborta con un error aritmético si la cantidad de desplazamiento está fuera de rango.


Estas instrucciones comparan dos valores enteros y apilan un resultado booleano. Ambos operandos deben ser del mismo tipo entero.

Opcode0x23
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Apila true si lhs < rhs, false en caso contrario.

Opcode0x24
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Apila true si lhs > rhs, false en caso contrario.

Opcode0x25
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Apila true si lhs <= rhs, false en caso contrario.

Opcode0x26
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Apila true si lhs >= rhs, false en caso contrario.


La igualdad está definida para tipos primitivos (bool, address, todos los tipos enteros), vector<T> donde T soporta igualdad, y referencias &T/&mut T donde T soporta igualdad. Ambos valores se consumen (el tipo debe tener la ability drop).

Opcode0x21
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Apila true si lhs == rhs, false en caso contrario.

Opcode0x22
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Apila true si lhs != rhs, false en caso contrario.


Estas instrucciones operan sobre valores bool.

Opcode0x1F
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Calcula lhs && rhs (AND lógico).

Opcode0x1E
OperandosNinguno
Stack[..., lhs, rhs] -> [..., bool]

Calcula lhs || rhs (OR lógico).

Opcode0x20
OperandosNinguno
Stack[..., value] -> [..., bool]

Calcula !value (NOT lógico).


Las instrucciones de conversión convierten un tipo entero a otro. Si el valor de origen está fuera del rango representable del tipo destino, la instrucción aborta con un error aritmético. Para tipos destino sin signo, los valores negativos de origen causan un aborto. Para CastU256 y CastI256, todos los valores enteros no negativos caben (aunque los valores negativos aún causan aborto para CastU256).

Opcode0x33
OperandosNinguno
Stack[..., int_value] -> [..., u8]

Convierte el valor entero superior a u8. Aborta si el valor es negativo o excede u8::MAX (255).

Opcode0x4B
OperandosNinguno
Stack[..., int_value] -> [..., u16]

Convierte el valor entero superior a u16. Aborta si el valor es negativo o excede u16::MAX (65535).

Opcode0x4C
OperandosNinguno
Stack[..., int_value] -> [..., u32]

Convierte el valor entero superior a u32. Aborta si el valor es negativo o excede u32::MAX.

Opcode0x34
OperandosNinguno
Stack[..., int_value] -> [..., u64]

Convierte el valor entero superior a u64. Aborta si el valor es negativo o excede u64::MAX.

Opcode0x35
OperandosNinguno
Stack[..., int_value] -> [..., u128]

Convierte el valor entero superior a u128. Aborta si el valor es negativo o excede u128::MAX.

Opcode0x4D
OperandosNinguno
Stack[..., int_value] -> [..., u256]

Convierte el valor entero superior a u256. Aborta si el valor es negativo.

Opcode0x61
OperandosNinguno
Stack[..., int_value] -> [..., i8]
DesdeBytecode v9

Convierte el valor entero superior a i8. Aborta si el valor está fuera del rango i8::MIN (-128) a i8::MAX (127).

Opcode0x62
OperandosNinguno
Stack[..., int_value] -> [..., i16]
DesdeBytecode v9

Convierte el valor entero superior a i16. Aborta si el valor está fuera del rango i16::MIN (-32768) a i16::MAX (32767).

Opcode0x63
OperandosNinguno
Stack[..., int_value] -> [..., i32]
DesdeBytecode v9

Convierte el valor entero superior a i32. Aborta si el valor está fuera del rango representable.

Opcode0x64
OperandosNinguno
Stack[..., int_value] -> [..., i64]
DesdeBytecode v9

Convierte el valor entero superior a i64. Aborta si el valor está fuera del rango representable.

Opcode0x65
OperandosNinguno
Stack[..., int_value] -> [..., i128]
DesdeBytecode v9

Convierte el valor entero superior a i128. Aborta si el valor está fuera del rango representable.

Opcode0x66
OperandosNinguno
Stack[..., int_value] -> [..., i256]
DesdeBytecode v9

Convierte el valor entero superior a i256. Aborta si el valor excede i256::MAX.


Opcode0x05
Operandoscode_offset (u16, little-endian)
Stack[...] -> [...]

Establece incondicionalmente el PC a code_offset. El desplazamiento es relativo al inicio del flujo de instrucciones de la función.

Opcode0x03
Operandoscode_offset (u16, little-endian)
Stack[..., bool] -> [...]

Desapila un booleano del stack. Si es true, establece el PC a code_offset. De lo contrario, avanza el PC en uno.

Opcode0x04
Operandoscode_offset (u16, little-endian)
Stack[..., bool] -> [...]

Desapila un booleano del stack. Si es false, establece el PC a code_offset. De lo contrario, avanza el PC en uno.

Opcode0x02
OperandosNinguno
Stack[..., ret_val_0, ..., ret_val_n] (los valores de retorno deben coincidir con la firma de la función)

Retorna de la función actual. El frame se desapila del stack de llamadas. Los valores de retorno (si los hay) permanecen en el stack de operandos del invocador. El número y los tipos de valores en el stack deben coincidir con la firma del tipo de retorno de la función.

Opcode0x27
OperandosNinguno
Stack[..., error_code]

Desapila un código de error u64 del stack y aborta la transacción. Todos los cambios realizados durante la transacción se revierten.

Opcode0x68
OperandosNinguno
Stack[..., error_code, error_message]
DesdeBytecode v10

Desapila un mensaje de error vector<u8> y un código de error u64 del stack y aborta la transacción con ambos. Esto proporciona diagnósticos más ricos que Abort solo.


Opcode0x11
Operandosfunc_handle_idx (ULEB128 — FunctionHandleIndex)
Stack[..., arg_0, ..., arg_n-1] -> [..., ret_0, ..., ret_m]

Llama a la función identificada por func_handle_idx. Los argumentos están en el stack en orden de declaración (el primer parámetro se apila primero, el último parámetro queda en la parte superior). Todos los argumentos se consumen.

Para funciones no nativas, se apila un nuevo frame en el stack de llamadas con los argumentos cargados como los primeros locales. Para funciones nativas, la VM despacha directamente a la implementación nativa; cuando retorna, los valores de retorno están en el stack del invocador.

Opcode0x38
Operandosfunc_inst_idx (ULEB128 — FunctionInstantiationIndex)
Stack[..., arg_0, ..., arg_n-1] -> [..., ret_0, ..., ret_m]

Versión genérica de Call. La entrada de la tabla de instanciación de funciones especifica tanto el handle de función como los argumentos de tipo concretos a sustituir por los parámetros genéricos de la función.


Estas instrucciones crean y destruyen instancias de struct.

Opcode0x12
Operandosstruct_def_idx (ULEB128 — StructDefinitionIndex)
Stack[..., field_0, ..., field_n-1] -> [..., struct_value]

Desapila los valores de campo del stack en orden de declaración (el primer campo se apila primero) y crea una nueva instancia de struct. Todos los campos deben proporcionarse.

Opcode0x39
Operandosstruct_inst_idx (ULEB128 — StructDefInstantiationIndex)
Stack[..., field_0, ..., field_n-1] -> [..., struct_value]

Versión genérica de Pack. La entrada de instanciación de struct proporciona los argumentos de tipo concretos.

Opcode0x13
Operandosstruct_def_idx (ULEB128 — StructDefinitionIndex)
Stack[..., struct_value] -> [..., field_0, ..., field_n-1]

Desapila un valor struct, lo destruye y apila sus valores de campo en el stack en orden de declaración (el primer campo se apila primero, el último campo queda en la parte superior).

Opcode0x3A
Operandosstruct_inst_idx (ULEB128 — StructDefInstantiationIndex)
Stack[..., struct_value] -> [..., field_0, ..., field_n-1]

Versión genérica de Unpack.


Estas instrucciones trabajan con tipos enum (structs con múltiples variantes). Fueron introducidas en la versión 7 del bytecode. Consulta el Historial de Versiones para detalles sobre cuándo se agregó el soporte de enum.

Opcode0x52
Operandosstruct_variant_handle_idx (ULEB128 — StructVariantHandleIndex)
Stack[..., field_0, ..., field_n-1] -> [..., variant_value]
DesdeBytecode v7

Desapila los valores de campo en orden de declaración y crea una nueva instancia de la variante de enum especificada. El handle de variante identifica tanto la definición del struct como la variante específica.

Opcode0x53
Operandosstruct_variant_inst_idx (ULEB128 — StructVariantInstantiationIndex)
Stack[..., field_0, ..., field_n-1] -> [..., variant_value]
DesdeBytecode v7

Versión genérica de PackVariant.

Opcode0x54
Operandosstruct_variant_handle_idx (ULEB128 — StructVariantHandleIndex)
Stack[..., variant_value] -> [..., field_0, ..., field_n-1]
DesdeBytecode v7

Desapila un valor que se espera sea la variante especificada. Lo destruye y apila sus campos en el stack en orden de declaración. Aborta si el valor no es la variante esperada.

Opcode0x55
Operandosstruct_variant_inst_idx (ULEB128 — StructVariantInstantiationIndex)
Stack[..., variant_value] -> [..., field_0, ..., field_n-1]
DesdeBytecode v7

Versión genérica de UnpackVariant.

Opcode0x56
Operandosstruct_variant_handle_idx (ULEB128 — StructVariantHandleIndex)
Stack[..., &variant_value] -> [..., bool] o [..., &mut variant_value] -> [..., bool]
DesdeBytecode v7

Desapila una referencia (inmutable o mutable) a un valor enum y apila true si el valor es la variante especificada, false en caso contrario. La referencia se consume.

Opcode0x57
Operandosstruct_variant_inst_idx (ULEB128 — StructVariantInstantiationIndex)
Stack[..., &variant_value] -> [..., bool] o [..., &mut variant_value] -> [..., bool]
DesdeBytecode v7

Versión genérica de TestVariant.

Opcode0x4E
Operandosvariant_field_handle_idx (ULEB128 — VariantFieldHandleIndex)
Stack[..., &variant_value] -> [..., &FieldType] o [..., &mut variant_value] -> [..., &FieldType]
DesdeBytecode v7

Desapila una referencia a un valor enum. Si el valor es la variante esperada, apila una referencia inmutable al campo especificado. Aborta si el valor no es la variante esperada.

Opcode0x50
Operandosvariant_field_inst_idx (ULEB128 — VariantFieldInstantiationIndex)
Stack[..., &variant_value] -> [..., &FieldType] o [..., &mut variant_value] -> [..., &FieldType]
DesdeBytecode v7

Versión genérica de ImmBorrowVariantField.

Opcode0x4F
Operandosvariant_field_handle_idx (ULEB128 — VariantFieldHandleIndex)
Stack[..., &mut variant_value] -> [..., &mut FieldType]
DesdeBytecode v7

Desapila una referencia mutable a un valor enum. Si el valor es la variante esperada, apila una referencia mutable al campo especificado. Aborta si el valor no es la variante esperada.

Opcode0x51
Operandosvariant_field_inst_idx (ULEB128 — VariantFieldInstantiationIndex)
Stack[..., &mut variant_value] -> [..., &mut FieldType]
DesdeBytecode v7

Versión genérica de MutBorrowVariantField.


Los closures capturan un subconjunto de los argumentos de una función en el momento de la creación, produciendo un valor invocable. Estas instrucciones fueron introducidas en la versión 8 del bytecode.

Opcode0x58
Operandosfunc_handle_idx (ULEB128 — FunctionHandleIndex), mask (ULEB128 — u64 bitmask)
Stack[..., captured_m, ..., captured_1] -> [..., closure]
DesdeBytecode v8

Crea un closure para la función identificada por func_handle_idx. La mask es una máscara de bits u64 que indica qué parámetros de la función se capturan. Si la función tiene parámetros (t1, t2, ..., tn) y el bit j de mask está activado, entonces el parámetro j se captura del stack.

Los valores capturados se desapilan del stack (en orden inverso de sus posiciones de parámetro). El closure resultante, cuando se invoca, aceptará solo los parámetros no capturados como argumentos.

El conjunto de abilities del valor closure es la intersección de las abilities de todos los valores capturados intersectada con las abilities inherentes de un handle de función (copy + drop, más store si la función es pública).

Opcode0x59
Operandosfunc_inst_idx (ULEB128 — FunctionInstantiationIndex), mask (ULEB128 — u64 bitmask)
Stack[..., captured_m, ..., captured_1] -> [..., closure]
DesdeBytecode v8

Versión genérica de PackClosure. Se usa cuando la función que se captura es una instanciación genérica. Una función genérica no instanciada no puede usarse para crear un closure.

Opcode0x5A
Operandossig_idx (ULEB128 — SignatureIndex, codificando el tipo de función)
Stack[..., arg_1, ..., arg_n, closure] -> [..., ret_0, ..., ret_m]
DesdeBytecode v8

Invoca un closure. El closure está en la parte superior del stack, con los argumentos restantes (no capturados) debajo. El sig_idx codifica el tipo de función esperado para propósitos de verificación de bytecode. En tiempo de ejecución, los argumentos capturados almacenados dentro del closure se combinan con los argumentos proporcionados para formar la lista completa de parámetros, y se llama a la función subyacente.

Semánticamente:

CallClosure(PackClosure(f, mask, c1..cn), a1..am) == f(mask.compose(c1..cn, a1..am))

Estas instrucciones integradas proporcionan manipulación eficiente de vectores sin pasar por llamadas a funciones nativas. Cada una toma un operando SignatureIndex que identifica el tipo de elemento del vector.

Opcode0x40
Operandoselem_ty_idx (ULEB128 — SignatureIndex), num_elements (ULEB128 — u64)
Stack[..., elem_0, ..., elem_n-1] -> [..., vector]

Desapila num_elements valores del stack y crea un nuevo vector que los contiene en orden (el primero apilado = primer elemento). Todos los valores deben coincidir con el tipo de elemento identificado por elem_ty_idx.

Opcode0x41
Operandoselem_ty_idx (ULEB128 — SignatureIndex)
Stack[..., &vector<T>] -> [..., u64] o [..., &mut vector<T>] -> [..., u64]

Desapila una referencia a un vector y apila su longitud como u64.

Opcode0x42
Operandoselem_ty_idx (ULEB128 — SignatureIndex)
Stack[..., &vector<T>, index] -> [..., &T] o [..., &mut vector<T>, index] -> [..., &T]

Desapila un índice u64 y una referencia a un vector, luego apila una referencia inmutable al elemento en ese índice. Aborta si el índice está fuera de límites.

Opcode0x43
Operandoselem_ty_idx (ULEB128 — SignatureIndex)
Stack[..., &mut vector<T>, index] -> [..., &mut T]

Desapila un índice u64 y una referencia mutable al vector, luego apila una referencia mutable al elemento en ese índice. Aborta si el índice está fuera de límites.

Opcode0x44
Operandoselem_ty_idx (ULEB128 — SignatureIndex)
Stack[..., &mut vector<T>, value] -> [...]

Desapila un valor y una referencia mutable al vector, luego agrega el valor al final del vector.

Opcode0x45
Operandoselem_ty_idx (ULEB128 — SignatureIndex)
Stack[..., &mut vector<T>] -> [..., T]

Desapila una referencia mutable al vector, elimina el último elemento del vector y apila ese elemento en el stack. Aborta si el vector está vacío.

Opcode0x46
Operandoselem_ty_idx (ULEB128 — SignatureIndex), num_elements (ULEB128 — u64)
Stack[..., vector<T>] -> [..., elem_0, ..., elem_n-1]

Desapila un vector (por valor), lo destruye y apila todos los num_elements elementos en el stack en orden (el primer elemento se apila primero). Aborta si la longitud real del vector no es igual a num_elements.

Opcode0x47
Operandoselem_ty_idx (ULEB128 — SignatureIndex)
Stack[..., &mut vector<T>, i, j] -> [...]

Desapila dos índices u64 (j en la parte superior, luego i) y una referencia mutable al vector, luego intercambia los elementos en las posiciones i y j. Aborta si alguno de los índices está fuera de límites.


Estas instrucciones apilan constantes enteras con signo en el stack. Fueron introducidas en la versión 9 del bytecode junto con el sistema de tipos de enteros con signo.

Opcode0x5B
Operandosi8_value (1 byte, con signo)
Stack[...] -> [..., i8_value]
DesdeBytecode v9

Apila la constante i8 dada en el stack.

Opcode0x5C
Operandosi16_value (2 bytes, little-endian, con signo)
Stack[...] -> [..., i16_value]
DesdeBytecode v9

Apila la constante i16 dada en el stack.

Opcode0x5D
Operandosi32_value (4 bytes, little-endian, con signo)
Stack[...] -> [..., i32_value]
DesdeBytecode v9

Apila la constante i32 dada en el stack.

Opcode0x5E
Operandosi64_value (8 bytes, little-endian, con signo)
Stack[...] -> [..., i64_value]
DesdeBytecode v9

Apila la constante i64 dada en el stack.

Opcode0x5F
Operandosi128_value (16 bytes, little-endian, con signo)
Stack[...] -> [..., i128_value]
DesdeBytecode v9

Apila la constante i128 dada en el stack.

Opcode0x60
Operandosi256_value (32 bytes, little-endian, con signo)
Stack[...] -> [..., i256_value]
DesdeBytecode v9

Apila la constante i256 dada en el stack.